Numeric vs Integer para una columna: tamaño y rendimiento


11

Tengo una aplicación que usa una tabla PostgreSQL. La tabla es muy grande (miles de millones de filas) y tiene una columna que es un número entero.

El integerpuede tener hasta 6 dígitos, es decir, 0-999,999, sin negativos.

Pensé en cambiarlo para que sea numeric(6,0).

¿Sería una buena idea? ¿ numeric(6,0)Tomaría menos bytes? ¿Qué tal el rendimiento (esta tabla se consulta mucho)?

Respuestas:


11

¿Sería una buena idea?

No.

sería numeric(6,0)tener menos bytes?

No.

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é tal el rendimiento (esta tabla se consulta mucho)?

Más lento. Se almacena como decimal codificado en binario porque es un valor de precisión arbitrario.


Todos estuvieron de acuerdo, ya que una nota numérica lateral tiene una ventaja, ya que aplica automáticamente el dominio 0-999999. Sin embargo, eso se puede resolver con una restricción separada en el caso int
Lennart

1
¿Hay algún problema al cambiar una numericcolumna int?
Racer SQL

@RacerSQL Sí, si tiene valores que desbordarán el tamaño int.
DylanYoung

5

La respuesta definitiva es no a todas sus preguntas. Integer es siempre el camino a seguir para cualquier cosa que pueda usar. (Dinero, por ejemplo)

Piénsalo por un minuto. Cuando el motor de la base de datos encuentra un número entero, lo maneja de manera muy eficiente porque no tiene mucha interpretación. Es un numero entero. El tipo numérico se comporta más como una cadena. El motor primero tiene que averiguar qué partes están antes y después del punto decimal, y masajearlas adecuadamente para realizar operaciones numéricas.

Usar un número entero siempre será más eficiente que un numérico, aunque los tipos numéricos a menudo son más convenientes para los humanos.


No estoy de acuerdo cuando se trata de dinero. Usar un número entero escalado, como almacenar decicentes (1000 por dólar) está bien, pero es incómodo. Rápidamente se vuelve más práctico de usar NUMERIC. Sin embargo, un número entero escalado es mucho mejor que usar un valor de punto flotante por dinero.
Craig Ringer

2
@CraigRinger ¡No creo que estés realmente en desacuerdo conmigo! Estoy de acuerdo en que usar un decimal por dinero siempre es menos incómodo para el desarrollador, pero la pregunta es la eficiencia de la consulta, ¿verdad? El manejo de enteros siempre es más rápido. Además, al escribir aplicaciones bancarias, puede entrar en algunos problemas de redondeo extraños que a la mayoría de las personas no les importarían, pero que son muy importantes para los bancos. Por lo tanto, también estoy de acuerdo con usted en no usar el punto flotante por dinero.
stubsthewizard

1
Buen punto de redondeo. Desearía que PostgreSQL tuviera soporte de políticas de redondeo. Sin embargo, no deseo lo suficiente para implementarlo;)
Craig Ringer
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.