Сколько значения размера "Null" в SQL Server
У меня есть большая таблица с 10 столбцами. 4 из них остаются нулевыми в большинстве случаев. У меня есть запрос, в котором значение null принимает размер или размер в байтах. Я прочитал несколько статей, некоторые из которых говорят:
http://www.sql-server-citation.com/2009/12/common-mistakes-in-sql-server-part-4.html
Существует неправильное представление о том, что если у нас есть значения NULL в таблице, они не занимают место для хранения. Дело в том, что значение NULL занимает пространство - 2 байта
SQL: использование значений NULL и значений по умолчанию
Значение A NULL
в базах данных - это системное значение, которое занимает один байт хранилища и указывает, что значение отсутствует, а не пробел или ноль или любое другое значение по умолчанию.
Можете ли вы рассказать мне о размере, выбранном нулевым значением.
Ответы
Ответ 1
Если поле фиксированной ширины хранения NULL занимает то же пространство, что и любое другое значение - ширина поля.
Если поле переменной ширины, значение NULL не занимает пробела.
В дополнение к пространству, требуемому для хранения нулевого значения, есть также накладные расходы для наличия столбца с нулевым значением. Для каждой строки используется один бит для столбца с нулевым значением, чтобы указать, является ли значение для этого столбца нулевым или нет. Это верно, является ли столбец фиксированной или переменной длиной.
Причина расхождений, которые вы наблюдали в информации из других источников:
-
Начало первой статьи немного вводит в заблуждение. В статье речь не идет о стоимости хранения значения NULL, а о стоимости наличия возможности хранить NULL (т.е. Затраты на создание столбца с нулевым значением). Это правда, что в хранилище что-то стоит, чтобы сделать столбец нулевым, но как только вы это сделали, для хранения значения NULL требуется меньше места, чем требуется для хранения значения (для столбцов с переменной шириной).
-
Вторая ссылка, похоже, связана с Microsoft Access. Я не знаю подробностей о том, как Access хранит NULL, но я не удивлюсь, если он отличается от SQL Server.
Ответ 2
Следующая ссылка утверждает, что если столбец является переменной длиной, то есть varchar
, то NULL
принимает 0 байтов (плюс 1 байт используется для отметки значения NULL
или нет):
Вышеупомянутая ссылка, а также ссылка ниже, утверждают, что для столбцов с фиксированной длиной, то есть char(10)
или int
, значение NULL
занимает длину столбца (плюс 1 байт, чтобы указать, NULL
или нет):
Примеры:
- Если вы установите значение
char(10)
в NULL
, оно занимает 10 байтов (обнулено)
- An
int
занимает 4 байта (также обнуляется).
- A
varchar(1 million)
, установленный в NULL
, принимает 0 байт (+ 2 байта)
Примечание: при небольшом касании размер хранилища varchar
- это длина введенных данных + 2 байта.
Ответ 3
Из этой ссылки:
Каждая строка имеет нулевую битовую карту для столбцов которые допускают нули. Если строка в этом столбец имеет значение null, а затем бит в bitmap равно 1 else 0.
Для типов данных с переменным размером acctual size - 0 байт.
Для фиксированного размера данных тип размер - это тип данных по умолчанию в байт установлено значение по умолчанию (0 для числа, '' для символов).
Ответ 4
Сохранение значения NULL не занимает места.
"Дело в том, что значение NULL занимает space - 2 байта."
Это заблуждение - это 2 байта на строку, и я уверен, что все строки используют эти 2 байта независимо от того, есть ли столбцы с нулевым значением.
Значение NULL в базах данных - это система значение, которое занимает один байт хранения
Это касается баз данных в целом, а не только SQL Server. SQL Server не использует 1 байт для хранения значений NULL.