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?
źródło
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).Odpowiedzi:
Zgadzam się, że nie ma żadnych rzeczywistych korzyści w zakresie miejsca do przechowywania, o ile porównujesz DECIMAL (9, 0) vs INT lub DECIMAL (18, 0) vs BIGINT. (W obrębie jednego bajtu.)
Jeśli chodzi o przetwarzanie, jak @Andriy mówi, że DECIMAL naturalnie podzieli się na typ, który nie traci części ułamkowej, jeśli jest to dla Ciebie ważne.
Z drugiej strony praca z rodzimymi typami INT jest znacznie szybsza z liczbowego punktu widzenia, jeśli wykonujesz dużo SUM (s) lub porównań (takich jak wyszukiwanie wartości), ponieważ są one wydajniej przetwarzane przez procesor. Porównanie int to dwa kody asemblacyjne (MOV, CMP), ale każde porównanie dziesiętne będzie o wiele, wiele więcej.
źródło
DECIMAL(9, 0)
zamiastINT
?DECIMAL
nadal trwa zwykle nieco dłużej (przynajmniej w moim systemie programistycznym). W serii 10 testów około 51 ms DEC vs. 46 ms INT.Wygląda na to, że nie będzie żadnych korzyści w zakresie miejsca do przechowywania.
Jeśli klient obawia się, że twoje wartości będą większe niż 2 ^ 32-1 (maksymalna liczba całkowita dodatnia może przechowywać), powinieneś rozważyć przejście do BigInt - z 64 bitami ( 8 bajtów) .
źródło