Numerico vs intero per una colonna: dimensioni e prestazioni


11

Ho un'applicazione che utilizza una tabella PostgreSQL. La tabella è molto grande (miliardi di righe) e ha una colonna che è un numero intero.

Il integerpossono essere fino a 6 cifre, cioè 0-999,999, non negativi.

Ho pensato di cambiarlo per essere numeric(6,0).

Sarebbe una buona idea? Richiederebbe numeric(6,0)meno byte? Che ne pensi delle prestazioni (questa tabella viene interrogata molto)?

Risposte:


11

Sarebbe una buona idea?

No.

sarebbe numeric(6,0)prendere meno byte?

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)

che ne dici delle prestazioni (questa tabella viene interrogata molto)?

Più lentamente. È memorizzato come decimale con codice binario perché è un valore di precisione arbitrario.


Tutti concordano, poiché un numero di nota a margine ha un vantaggio in quanto applica automaticamente il dominio 0-999999. Ciò può tuttavia essere risolto con un vincolo separato nel caso int
Lennart,

1
Si è verificato un problema durante la modifica di una numericcolonna int?
Racer SQL,

@RacerSQL Sì se si hanno valori che supereranno la dimensione int.
DylanYoung,

5

La risposta definitiva è no a tutte le tue domande. Integer è sempre la strada da percorrere per qualsiasi cosa tu possa usarlo. (Denaro, per esempio)

Pensaci per un minuto. Quando il motore di database rileva un numero intero, lo gestisce in modo molto efficiente perché non presenta molte interpretazioni. È un numero intero. Il tipo numerico si comporta più come una stringa. Il motore deve prima capire quali parti sono prima e dopo il punto decimale e massaggiarle in modo appropriato per eseguire operazioni numeriche.

L'uso di un numero intero sarà sempre più efficiente di un valore numerico, sebbene i tipi numerici siano spesso più convenienti per l'uomo.


Non sono d'accordo quando si tratta di soldi. L'uso di un numero intero ridimensionato, come la memorizzazione di decicenti (1000 per dollaro) è ok, ma scomodo. Diventa rapidamente più pratico da usare NUMERIC. Tuttavia, un intero in scala è molto meglio dell'utilizzo di un valore in virgola mobile per denaro.
Craig Ringer,

2
@CraigRinger Non penso che tu sia davvero in disaccordo con me! Sono d'accordo che l'utilizzo di un decimale per soldi è sempre meno imbarazzante per lo sviluppatore, ma la domanda è l'efficienza delle query, giusto? La gestione dei numeri interi è sempre più veloce. Inoltre, quando si scrivono applicazioni bancarie, è possibile entrare in alcuni strani problemi di arrotondamento di cui la maggior parte delle persone non si preoccuperebbe, ma sono molto importanti per le banche. Quindi, sono anche d'accordo con te sul non usare anche il floating point per soldi!
Stubsthewizard,

1
Ottimo punto di arrotondamento. Vorrei che PostgreSQL avesse il supporto per la politica di arrotondamento. Non desiderarlo abbastanza per implementarlo però;)
Craig Ringer
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.