Один з наших клієнтів використовує для деяких стовпців тип даних DECIMAL(18,0)
у своїй базі даних SQL Server 2008R2. Оскільки стовпці ростуть досить повільно, він нещодавно запропонував змінити тип даних, DECIMAL(5,0)
щоб відновити деякий обсяг пам’яті.
За даними бібліотеки MSDN , місце зберігання DECIMAL(5,0)
типу даних становить, як і DECIMAL(9,0)
тип даних, 5 байт. INT
на 1 байт менше, але може зберігати все в діапазоні від -2 ^ 31 до 2 ^ 31 замість від -99,999 до 99,999, яке DECIMAL(5,0)
може зберігатись. Навіть найбільший, DECIMAL
який вміщується в 5 байт ( DECIMAL(9,0)
), може зберігати лише цілі числа в діапазоні від -999,999,999 до 999,999,999 (що менше половини пропонованого діапазону INT
в 4 байти).
Я можу придумати дві "переваги" використання DECIMAL
над INT
:
- Можливість додавати масштаб згодом, не використовуючи більше місця для зберігання
- Можливість масштабування точності до 38 цифр, не змінюючи тип даних
але, на мою думку, це не реальна користь:
- Додавання шкали до цілих чисел має сенс лише у дуже небагатьох випадках (у більшості випадків, коли масштаб має значення, він також може бути доданий заздалегідь)
- SQL Server розглядає кожну комбінацію точності / масштабу як різний тип даних, тому тип даних не залишається у спокої при збільшенні точності або масштабу.
Це змушує мене замислитися: яка додаткова перевага DECIMAL(5,0)
типу даних для цілих чисел?
decimal(x,0)
цілим числом проявляється в арифметичному поділі. Якщо ви поділите інт на інт, ви отримаєте інт. Якщо розділити десятковий (x, 0) на int, ви отримаєте десятковий (x + 6,6).