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