SQL Server 2014 — размер varchar (x) NULL

Тема размера значений NULL обсуждалась во многих темах, таких как один в SO.

Я мог понять, что если строка имеет фиксированный размер, int или varchar(x) NULL valeus занимают место (нули, если атрибут равен int, или пробелы, если атрибут равен varchar(x)) + 1 байт для растрового изображения NULL.

Я создал таблицу с двумя атрибутами:
CREATE TABLE Person (id int NULL, name VARCHAR(50) NULL).

И использовал скрипт здесь, чтобы получить для каждой строки размер в B:

введите здесь описание изображения

Я мог прочитать из таблицы следующие факты:
- Первые три строки: 1 байт на каждую букву + 1 байт для растрового изображения NULL.
- 4-я строка: 2 растровых изображения NULL.
- последние две строки: 4 байта int + 1 байт для растрового изображения NULL.

Почему приведенные выше значения int/varchar(50) NULL не заняли весь заявленный размер?

Я использую SQL Server Management Studio 2014. Изменились ли нормы?


person Infogeek    schedule 06.09.2014    source источник


Ответы (1)


  1. Сценарий, который вы использовали, неверен. Использование datalength() не будет получать физическую длину.
  2. Ваши ожидания неверны. Поля переменной длины не принимают «пробелы» для NULL, и на самом деле целые числа также могут не принимать 0 с учетом сжатия строк.

Используйте sys.dm_db_index_physical_stats для получения min_record_size_in_bytes, max_record_size_in_bytes и avg_record_size_in_bytes. Прочитайте столбцы таблицы SQL Server изнутри и внутри механизма хранения: Анатомия записи для объяснения размера записи. Прочитайте Реализация сжатия строк, чтобы лучше понять некоторые альтернативы.

person Remus Rusanu    schedule 06.09.2014
comment
Я смешал char с varchar. Какая ошибка! Спасибо за расшифровку и ссылки. - person Infogeek; 06.09.2014