Vous n'êtes pas identifié(e).
Pages : 1
Bonjour,
J'ai deux tables contenant des valeurs numérique et des dates. Ces tables on une croissance importante (plusieurs dizaine de millier de tuples par jour sur 29 colonnes).
Je souhaiterai avoir votre avis sur les types à utiliser pour stocker ces valeurs, dois-je plutôt utiliser le type double ou numeric(x,y), afin d'optimiser la table en terme de taille et de performance.
Merci
Hors ligne
Ça dépend de ce que vous voulez en faire.
Double est le plus souvent plus compact, et plus rapide pour les calculs.
Mais numeric permet de faire des calculs exacts, ce que ne permet pas real (erreurs d'arrondis, c'est une notation mantisse + exposant).
Marc.
Hors ligne
Il y a plusieurs choses:
- Affichage des données sous forme de graphique
- Affichage des données sous forme de tableau Excel
- Petit calcul de type addition, moyenne...
- Statistique basique
Le valeur numérique des capteurs ne sont pas très grande mais il y en a beaucoup. Dans la majeur partie des cas, elles comportent une partie entière de 5 entiers et 3 décimale.
Dernière modification par GloReX (20/04/2011 13:51:11)
Hors ligne
La réponse est la même: ça dépend de si vous avez besoin de calculs exacts, ou si les erreurs d'arrondi sont acceptables. Pour du financier par exemple, il est hors de question d'utiliser les types real et double.
Marc.
Hors ligne
Les calculs ne doivent pas être exact.
En terme de performance, si j'ai bien compris votre réponse, le double est préférable.
Dernière modification par GloReX (20/04/2011 14:10:39)
Hors ligne
Oui. Le double utilise les opérations du processeur (via la librairie C). Alors que numeric, afin d'être exact, doit effectuer bien plus d'opérations.
Marc.
Hors ligne
Et bien merci, j'allais faire une connerie...
Hors ligne
Ça aurait pas été une très grosse connerie. C'est plus simple de passer de numeric à real quand on s'est trompé que dans l'autre sens: on ne perd pas de données avec numeric.
Marc.
Hors ligne
Du coup je vais me retrouver avec des valeurs ressemblant a 145,12499999999. Est-il donc possible de "limiter" la précision ?
Dernière modification par GloReX (20/04/2011 15:05:31)
Hors ligne
Dans la table ? Non.
À l'affichage, bien sûr, il suffit d'utiliser les fonctions d'arrondi : http://docs.postgresql.fr/9.0/functions-math.html
Marc.
Hors ligne
Dans la table ? Non.
Bien sur que si... Cela fait partie de la norme SQL que PG respecte assez bien !!!
Démo :
CREATE TABLE TRE (C1 NUMERIC(16,2));
INSERT INTO TRE VALUES (1), (1.23), (1234567.89), (1.23456789);
SELECT * FROM TRE;
Et la réponse :
1.00
1.23
1234567.89
1.23
A +
Frédéric Brouard, alias SQLpro, ARCHITECTE DE DONNÉES, Expert langage SQL
Le site sur les SGBD relationnel et langage SQL : http://sqlpro.developpez.com/
Modélisation de données, conseil, expertise, audit, optimisation, tuning, formation
* * * * * Enseignant CNAM PACA, ISEN Toulon, CESI Aix en Provence * * * * *
Hors ligne
GloReX et Marc parlaient du type real, pas du type numeric.
Guillaume.
Hors ligne
ok,
Encore une petite question concernant la définition d'un type numérique.
La définition d'une colonne au format float(p) est-elle juste une implémentation destinée a la conformité au langage SQL ou la précision p est-elle réellement appliquée,
car il me semble avoir lu dans la doc que float(p) pour p [1-24] est transformé en real.
Donc écrire float(9) reviendrait au même que d'écrire float(6) transformé en real ayant une précision de 6.
Est-ce exact ?
Merci à tous
Hors ligne
marc=# CREATE TABLE test (a float(6));
CREATE TABLE
marc=# CREATE TABLE test2 (a float(40));
CREATE TABLE
marc=# \d test
Table "public.test"
Column | Type | Modifiers
--------+------+-----------
a | real |
marc=# \d test2
Table "public.test2"
Column | Type | Modifiers
--------+------------------+-----------
a | double precision |
Ils sont donc convertis en real et double…
Attention, la précision est en bit de la mantisse, pas en nombre décimaux.
Marc.
Hors ligne
Pages : 1