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?
quelle
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).Antworten:
Ich bin damit einverstanden, dass es in Bezug auf die Lagerung keine wirklichen Vorteile gibt gibt, solange Sie DECIMAL (9, 0) mit INT oder DECIMAL (18, 0) mit BIGINT vergleichen. (Innerhalb eines einzelnen Bytes.)
In Bezug auf die Verarbeitung, wie @Andriy sagt, teilt sich das DECIMAL natürlich in einen Typ auf, der den Bruchteil nicht verliert, wenn das für Sie wichtig ist.
Auf der anderen Seite ist die Arbeit mit nativen INT-Typen vom numerischen Standpunkt aus viel schneller, wenn Sie eine Vielzahl von SUM () - oder Vergleichsoperationen ausführen (z. B. die Suche nach Werten), da diese von der CPU effizienter weitergeleitet werden. Ein int-Vergleich besteht aus zwei Assembly-Opcodes (MOV, CMP), aber jeder Dezimalvergleich ist um ein Vielfaches größer.
quelle
DECIMAL(9, 0)
anstelle von einen Leistungstest ein Leistungshit istINT
?DECIMAL
dauert das meist noch etwas länger (zumindest auf meinem Entwicklungssystem). In einem Durchlauf von 10 Tests um 51 ms DEC gegenüber 46 ms INT.Es sieht so aus, als gäbe es keine Vorteile hinsichtlich des Speicherplatzes.
Wenn Ihr Client befürchtet, dass Ihre Werte größer als 2 ^ 32-1 sind (maximaler positiver Wert, den eine Ganzzahl speichern kann), sollten Sie in Betracht ziehen, auf BigInt umzusteigen - mit 64 Bit ( 8 Byte) .
quelle