Сколько значение размера «Null» принимает в SQL Server - PullRequest
110 голосов
/ 17 сентября 2010

У меня есть большая таблица, скажем, 10 столбцов.4 из них остаются нулевыми в большинстве случаев.У меня есть запрос, который делает нулевое значение принимает любой размер или нет размера в байтах.Я прочитал несколько статей, некоторые из которых говорят:

http://www.sql -server-citation.com / 2009/12 / common-errors-in-sql-server-part-4.html

Существует ошибочное мнение, что, если в таблице есть значения NULL, она не занимает место в хранилище.Дело в том, что значение NULL занимает пространство - 2 байта

SQL: использование значений NULL и значений по умолчанию

Значение NULL в базах данных - это системное значение, занимающее один байт хранилища и указывающее, что значение отсутствует в отличие от пробела, нуля или любого другого значения по умолчанию.

Подскажите, пожалуйста, размер, принятый нулевым значением.

Ответы [ 4 ]

137 голосов
/ 17 сентября 2010

Если поле имеет фиксированную ширину хранения, NULL занимает то же пространство, что и любое другое значение - ширина поля.

Если поле переменной ширины, значение NULL не занимает места.

В дополнение к пространству, необходимому для хранения нулевого значения, есть также издержки на наличие столбца, который может иметь значение NULL.Для каждой строки один бит используется для каждого столбца, который может иметь значение NULL, чтобы указать, является ли значение для этого столбца нулевым или нет.Это верно, независимо от того, является ли столбец фиксированной или переменной длины.


Причина расхождений, которые вы наблюдали в информации из других источников:

  • Началопервой статьи немного вводит в заблуждение.В статье речь идет не о стоимости хранения значения NULL, а о стоимости способности хранить значение NULL (т. Е. О стоимости обнуления столбца).Это правда, что для того, чтобы сделать столбец обнуляемым, нужно что-то в пространстве хранения, но как только вы это сделаете, для хранения значения NULL потребуется меньше, чем для хранения значения (для столбцов переменной ширины).

  • Вторая ссылка, похоже, связана с Microsoft Access.Я не знаю деталей того, как Access хранит значения NULL, но я не удивлюсь, если он отличается от SQL Server.

29 голосов
/ 17 сентября 2010

Следующая ссылка утверждает, что если столбец имеет переменную длину, то есть varchar, то NULL занимает 0 байтов (плюс 1 байт используется, чтобы указать, является ли значение NULL или нет):

Приведенная выше ссылка, а также ссылка ниже, утверждают, что для столбцов фиксированной длины, то есть char(10) илиint, значение NULL занимает длину столбца (плюс 1 байт, чтобы указать, является ли он NULL или нет):

Примеры:

  1. Если установить char(10) на NULL, он будет занимать 10 байтов (обнуляется)
  2. int занимает 4 байта (также обнуляется).
  3. A varchar(1 million), установленный на NULL, принимает 0 байтов (+ 2 байта)

Примечание: по небольшому касанию размер хранилища varchar - это длина введенных данных + 2 байта.

5 голосов
/ 17 сентября 2010

По этой ссылке :

Каждая строка имеет нулевое растровое изображение для столбцов, которые допускают нулевые значения.Если строка в этом столбце равна нулю, то бит в растровом изображении равен 1, иначе это 0.

Для типов данных переменного размера фактический размер равен 0 байтов.

Для типа данных фиксированного размера действительный размерэто размер типа данных по умолчанию в байтах, установленный в значение по умолчанию (0 для чисел, '' для символов).

4 голосов
/ 17 сентября 2010

Хранение значения NULL не занимает места.

"Дело в том, что значение NULL занимает пробел - 2 байта."

Это ошибочное представление- это 2 байта на строку , и я вполне уверен, что все строки используют эти 2 байта независимо от того, есть ли какие-либо столбцы, допускающие значение NULL.

Значение NULL в базах данныхсистемное значение, занимающее один байт хранилища

Это говорит о базах данных в целом, а не конкретно о SQL Server.SQL Server не использует 1 байт для хранения значений NULL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...