Один з наших клієнтів використовує для деяких стовпців тип даних 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).