Один из наших клиентов использует для некоторых столбцов тип данных 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)и целочисленным типом проявляется в арифметическом делении. Если вы делите int на int, вы получаете int. Если вы разделите десятичное число (x, 0) на int, вы получите десятичное число (x + 6,6).