Сколько значения размера "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.