Einer unserer Kunden verwendet für einige Spalten den Datentyp DECIMAL(18,0)
in seiner SQL Server 2008R2-Datenbank. Da die Spalten relativ langsam wachsen, schlug er kürzlich vor, den Datentyp zu ändern DECIMAL(5,0)
, um Speicherplatz freizugeben .
Entsprechend der MSDN-BibliothekDECIMAL(5,0)
beträgt der Speicherplatz des Datentyps genau wie der DECIMAL(9,0)
Datentyp 5 Byte. INT
ist 1 Byte kleiner, kann aber alles im Bereich von -2 ^ 31 bis 2 ^ 31 statt der -99.999 bis 99.999 DECIMAL(5,0)
speichern, die gespeichert werden können. Sogar die größte, DECIMAL
die in 5 Bytes ( DECIMAL(9,0)
) passt, kann nur Ganzzahlen im Bereich von -999.999.999 bis 999.999.999 (was weniger als der Hälfte des Bereichs entspricht, INT
der in 4 Bytes angeboten wird) speichern .
Ich kann mich zwei „Vorteile“ der Verwendung von DECIMAL
mehr als INT
:
- Die Möglichkeit, nachträglich Skalierungen vorzunehmen, ohne mehr Speicherplatz zu benötigen
- Die Möglichkeit, die Genauigkeit auf 38 Stellen zu skalieren, ohne den Datentyp zu ändern
aber das sind meiner meinung nach keine wirklichen vorteile:
- Das Hinzufügen einer Skalierung zu Ganzzahlen ist nur in wenigen Fällen sinnvoll (in den meisten Fällen, in denen eine Skalierung einen Unterschied macht, kann sie auch vorher hinzugefügt werden).
- SQL Server betrachtet jede Genauigkeits- / Skalierungskombination als einen anderen Datentyp, sodass der Datentyp beim Erhöhen der Genauigkeit oder Skalierung nicht allein gelassen wird.
Ich frage mich daher: Was ist der zusätzliche Vorteil eines DECIMAL(5,0)
Datentyps für Ganzzahlen?
decimal(x,0)
und einem Integer-Typ zeigt sich in der arithmetischen Division. Wenn Sie ein Int durch ein Int teilen, erhalten Sie ein Int. Wenn Sie eine Dezimalzahl (x, 0) durch ein Int dividieren, erhalten Sie eine Dezimalzahl (x + 6,6).