2014-01-13 2 views
11

Каков размер типов данных с возможностью NULL в СУБД Microsoft SQL Server?Типы данных NULL для SQL Server

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

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

То, что я прочитал:

  • Where to find the size of SQL Server data types - хороший способ получить список 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, но действительно ли он хранится таким образом?
  • How much size "Null" value takes in SQL Server - как для меня верхние ответы сбивают с толку. @Mark Byers сказал: «Если фиксированное фиксированное значение поля NULL занимает то же пространство, что и любое другое значение - ширина поля», но невозможно сохранить стандартный целочисленный интервал значений и дополнительное значение NULL в том же количестве биты. Затем «Если поле переменной ширины, значение NULL не занимает пробела» - повторное хранение NULL не может занимать места вообще - ему нужно сохранить некоторый маркер для нулевого значения. Подобная путаница с другими ответами там: кто-то говорит, что он принимает 2 дополнительных байта, кто-то - это только 1 байт.
  • http://home.clara.net/drdsl/MSSQL/DataTypes.html - красивый стол с размерами типов, но опять-таки ничего не посвященный значениям NULL.

ответ

7

Обнуляемые колонны и Ненулевые столбцы занимают точно такой же хранение на странице данных. Часть каждой страницы данных представляет собой нулевую битовую карту, которая имеет бит для каждый столбец в таблице, даже непустые.

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

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

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

4

По поддержке Microsoft

  1. значение NULL в SQL Server 2008:

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

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

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

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

+0

Хорошая ссылка, спасибо. Впервые я услышал о редких столбцах =). Я не уверен, что вы можете подтвердить, но действительно ли это 1 дополнительный бит, или он занимает весь байт? Поскольку тип данных бит на сервере SQL фактически использует 1 байт. –

+0

Btw, для разреженных столбцов, рассмотрим [это] (http://technet.microsoft.com/en-us/library/cc280604.aspx), часть _Создание экономии места по типу данных. – OzrenTkalcecKrznaric

+1

@OleksandrPshenychnyy - SQL Server упакует бит NULL-флагов в байты, поэтому до 8 столбцов с нулевым значением несут только однобайтовые служебные данные. – HABO

Смежные вопросы