Numérique vs entier pour une colonne - taille et performances


11

J'ai une application qui utilise une table PostgreSQL. Le tableau est très grand (milliards de lignes) et possède une colonne qui est un entier.

Le integerpeut contenir jusqu'à 6 chiffres, soit 0-999 999, pas de négatif.

J'ai pensé à le changer numeric(6,0).

Serait-ce une bonne idée? Prendrait numeric(6,0)moins d'octets? Qu'en est-il des performances (ce tableau est beaucoup interrogé)?

Réponses:


11

Serait-ce une bonne idée?

Non.

serait numeric(6,0)prendre moins d' octets?

Non.

test=> SELECT pg_column_size(INT4 '999999'), pg_column_size(NUMERIC(6,0) '999999');
 pg_column_size | pg_column_size 
----------------+----------------
              4 |             10
(1 row)

qu'en est-il de la performance (ce tableau est beaucoup interrogé)?

Ralentissez. Il est stocké sous forme décimale codée en binaire car il s'agit d'une valeur de précision arbitraire.


Tous sont d'accord, car une note numérique a un avantage car elle applique automatiquement le domaine 0-999999. Cela peut cependant être résolu avec une contrainte distincte dans le cas int
Lennart

1
Y a-t-il un problème pour remplacer une numericcolonne par int?
Racer SQL

@RacerSQL Oui si vous avez des valeurs qui dépasseront la taille int.
DylanYoung

5

La réponse définitive est non à toutes vos questions. Entier est toujours la voie à suivre pour tout ce que vous pouvez l'utiliser. (L'argent, par exemple)

Pensez-y une minute. Lorsque le moteur de base de données rencontre un entier, il le gère très efficacement car il n'y a pas beaucoup d'interprétation. C'est un nombre entier. Le type numérique se comporte plus comme une chaîne. Le moteur doit d'abord déterminer quelles parties se trouvent avant et après la virgule décimale et les masser de manière appropriée pour effectuer des opérations numériques.

L'utilisation d'un entier sera toujours plus efficace qu'un numérique, bien que les types numériques soient souvent plus pratiques pour les humains.


Je ne suis pas d'accord en ce qui concerne l'argent. Utiliser un entier mis à l'échelle, comme stocker des décicents (1000 par dollar), c'est correct, mais gênant. Il devient rapidement plus pratique à utiliser NUMERIC. Un entier mis à l'échelle est bien mieux que d'utiliser une valeur à virgule flottante pour l'argent.
Craig Ringer

2
@CraigRinger Je ne pense pas que vous soyez en désaccord avec moi! Je suis d'accord que l'utilisation d'une décimale pour de l'argent est toujours moins gênante pour le développeur, mais la question est l'efficacité des requêtes, non? La gestion des entiers est toujours plus rapide. De plus, lors de la rédaction d'applications bancaires, vous pouvez vous retrouver dans des problèmes d'arrondi étranges dont la plupart des gens ne se soucient pas, mais qui sont très importants pour les banques. Donc, je suis également d'accord avec vous sur le fait de ne pas utiliser la virgule flottante pour l'argent aussi!
stubsthewizard

1
Bon point sur l'arrondi. Je souhaite que PostgreSQL ait un support de politique d'arrondi. Mais ne le souhaite pas assez pour l'implémenter;)
Craig Ringer
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.