Jeden z naszych klientów używa w niektórych kolumnach typu danych DECIMAL(18,0)
w swojej bazie danych SQL Server 2008R2. Ponieważ kolumny rosną dość wolno, ostatnio zaproponował zmianę typu danych, DECIMAL(5,0)
aby odzyskać trochę pamięci.
Według biblioteki MSDN miejsce do przechowywania DECIMAL(5,0)
typu danych wynosi, podobnie jak DECIMAL(9,0)
typ danych, 5 bajtów. INT
jest o 1 bajt mniejszy, ale może przechowywać wszystko w zakresie od -2 ^ 31 do 2 ^ 31 zamiast -99 999 do 99 999, które DECIMAL(5,0)
mogą przechowywać. Nawet największa, DECIMAL
która mieści się w 5 bajtach ( DECIMAL(9,0)
), może przechowywać tylko liczby całkowite z zakresu od -999,999,999 do 999,999,999 (co stanowi mniej niż połowę INT
oferty zakresu w 4 bajtach).
Mogę wymyślić dwie „zalety” korzystania DECIMAL
z INT
:
- Możliwość późniejszego dodania skali bez zajmowania większej przestrzeni dyskowej
- Możliwość skalowania dokładności do 38 cyfr, bez zmiany typu danych
ale moim zdaniem nie są to realne korzyści:
- Dodanie skali do liczb całkowitych ma sens tylko w nielicznych przypadkach (w większości przypadków, w których skala robi różnicę, można ją również dodać wcześniej)
- SQL Server widzi każdą kombinację precyzji / skali jako inny typ danych, więc typ danych nie jest pozostawiony samemu sobie podczas zwiększania precyzji lub skali.
Zastanawiam się: jaka jest dodatkowa korzyść DECIMAL(5,0)
typu danych dla liczb całkowitych?
decimal(x,0)
typem całkowitym a liczbą całkowitą pokazuje się w podziale arytmetycznym. Jeśli podzielisz liczbę całkowitą przez liczbę całkowitą, otrzymasz liczbę całkowitą. Dzieląc liczbę dziesiętną (x, 0) przez liczbę całkowitą, otrzymujesz liczbę dziesiętną (x + 6,6).