Размер данных NULL для SQL Server

Каков размер нулевых типов данных в СУБД Microsoft SQL Server?

Например, значение non-nullable int должно занимать 4 байта, сколько места будет выделено для столбца с нулевым значением?

Подзапросы: nullable int, char (N), nvarchar (N) - Я предполагаю, что они могут храниться по-разному.

Что я читал:

  • Где найти размер типов данных SQL Server - хороший способ получить список типов sql и их размер для моей версии SQL-сервера. Но не говорит ни слова о типах с нулевым значением.
  • http://msdn.microsoft.com/en-us/library/ms189124.aspx - существует формула для вычисления требуемого пространства столбцов переменной величины: "Variable_Data_Size = 2 + (Num_Variable_Cols x 2) + Max_Var_Size". Это очень странно: почему в нем содержится множитель * 2 (ничего не сказано о nvarchar - эта формула предназначена для всех типов переменных размеров, которые исходят из объяснения); это должна быть опечатка, которая добавляется Max_Var_Size, а не умножается; и, наконец, он содержит +2 байта для хранения длины значения, но снова не содержит ничего для хранения значений NULL. Насколько я понимаю, можно использовать 3 оставшихся бита длиной 2 байта для хранения идентификатора NULL, но действительно ли он хранится таким образом?
  • Сколько размера "Null" значение берет в SQL Server - поскольку для меня лучшие ответы сбивают с толку. @Mark Byers сказал: "Если фиксированное фиксированное значение поля NULL занимает то же пространство, что и любое другое значение - ширина поля", но невозможно сохранить стандартный целочисленный интервал значений и дополнительное значение NULL в том же количестве биты. Затем "Если поле переменной ширины, значение NULL не занимает пробела" - повторное хранение NULL не может занимать места вообще - ему нужно сохранить некоторый маркер для нулевого значения. Подобная путаница с другими ответами там: кто-то говорит, что он принимает 2 дополнительных байта, кто-то - это только 1 байт.
  • http://home.clara.net/drdsl/MSSQL/DataTypes.html - хорошая таблица с размерами типов, но опять же ничего не предназначено для значений NULL.

Ответ 1

Nullable columns и non-nullable columns занимают точно такое же хранилище на странице данных. Часть каждой страницы данных представляет собой нулевую битовую карту, которая имеет бит для каждого столбца в таблице, даже непустые.

Это распространенное заблуждение, что в разделе нулевой битовой карты страницы данных хранятся только биты для столбцов с нулевым значением. Это неправда. Раздел null-bit-map содержит флаги с нулевым значением для всех столбцов в таблице. Здесь - хорошая ссылка, объясняющая этот миф. Здесь это другое.

Я задаюсь вопросом, почему SQL Server (и ранее Sybase) использует эту структуру. Одна из возможностей заключается в том, что изменение обнуляемости столбца может быть "быстрой" операцией. Хотя бит сильно меняется на всех страницах, нет опасности разбиения страниц, введя новое поле NULLable.

Другая возможность заключается в том, что она немного развязывает макет на странице из метаданных таблицы. Хотя страница не знает имена столбцов, она знает все о столбцах на основе индексов столбцов.

Ответ 2

Согласно поддержке Microsoft

  • Значение NULL в SQL Server 2008:

    - SPARSE требуется дополнительно 6 байтов размер строки + 4 байта на ненулевой столбец + байты значений (тип не имеет значения)
    - для значения NULL в обычном NULL требуется 1 бит в битовой карте NULL.

  • Пустая строка в SQL Server 2008:

    - Для данных фиксированной длины требуется полное пространство данных, даже если введена пустая строка - Данные переменной длины нуждаются в 2 байтах для хранения данных - Нет пустой строки для числовых значений - Значение NULL требует 1 бит в растровом NULL

ссылка: http://social.msdn.microsoft.com/Forums/sqlserver/en-US/0404de89-70dc-4026-9e2e-13ddc3e7c058/null-data-storage-sql-server-2008?forum=sqldatabaseengine