Uno dei nostri clienti utilizza per alcune colonne il tipo DECIMAL(18,0)
di dati nel suo database SQL Server 2008R2. Poiché le colonne crescono abbastanza lentamente, ha recentemente proposto di modificare il tipo di dati in DECIMAL(5,0)
per recuperare spazio di archiviazione.
Secondo la libreria MSDN , lo spazio di archiviazione del DECIMAL(5,0)
tipo di dati è, proprio come il DECIMAL(9,0)
tipo di dati, 5 byte. INT
è più piccolo di 1 byte, ma può memorizzare tutto nell'intervallo compreso tra -2 ^ 31 e 2 ^ 31 anziché tra -99.999 e 99.999 che DECIMAL(5,0)
può memorizzare. Anche il più grande DECIMAL
che si inserisce in 5 byte ( DECIMAL(9,0)
) può memorizzare solo numeri interi compresi tra -999.999.999 e 999.999.999 (che è meno della metà dell'intervallo INT
offerto in 4 byte).
Posso pensare a due "vantaggi" dell'uso di DECIMAL
over INT
:
- La possibilità di aggiungere successivamente la scala, senza utilizzare più spazio di archiviazione
- La possibilità di ridimensionare la precisione fino a 38 cifre, senza alterare il tipo di dati
ma questi non sono vantaggi reali secondo me:
- L'aggiunta di scala a numeri interi ha senso solo in pochissimi casi (nella maggior parte dei casi in cui la scala fa la differenza, potrebbe anche essere aggiunta in anticipo)
- SQL Server vede ogni combinazione precisione / scala come un diverso tipo di dati, quindi il tipo di dati non viene lasciato solo quando si aumenta la precisione o la scala.
Questo mi fa meravigliare: qual è il vantaggio aggiunto di un DECIMAL(5,0)
tipo di dati per numeri interi?
decimal(x,0)
e un tipo intero si mostra nella divisione aritmetica. Se dividi un int per un int, ottieni un int. Se si divide un decimale (x, 0) per un int, si ottiene un decimale (x + 6,6).