Размер данных 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