В SQL Server почему tinyint хранится с 9B в строке. По какой-то причине, кажется, есть дополнительный один байт в конце маски битовой карты NULL.
ИСПОЛЬЗОВАТЬ tempdb; ИДТИ СОЗДАТЬ СТОЛ TBL ( я TINYINT НЕ NULL ); ИДТИ INSERT INTO tbl (i) ЦЕННОСТИ (1); ИДТИ DBCC IND ('tempdb', 'tbl', - 1); ИДТИ DBCC TRACEON (3604); - Дамп страницы уйдет в консоль ИДТИ DBCC PAGE ('tempdb', 1 168,3); ИДТИ
Результаты (я поменял местами байты из-за того, что DBCC PAGE сначала отображал младший байт):
Record Size = 9B
10000500 01010000 00
TagA = 0x10 = 1B
TagB = 0x00 = 1B
Null Bitmap Offset = 0x0005 = 2B
Our integer column = 0x01 = 1B
Column Count = 0x0001 = 2B
NULL Bitmap = 0x0000 = 2B (what!?)
sql-server-2008
ooutwire
источник
источник
Ответы:
Если вы вычисляете запись, используя простое добавление размера, вы действительно получите 8: 4 + 1 + 2 + 1 (заголовок + фиксированный размер + счетчик нулевого растрового изображения + само нулевое растровое изображение). Но запись кучи не может быть меньше размера заглушки пересылки , которая составляет 9 байтов, поскольку запись должна гарантировать, что ее можно заменить заглушкой пересылки. Следовательно, запись будет фактически на 9 байтов. A
smallint
будет 9 байтов как с помощью вычисления, так и с минимальным размером. Все, что больше, уже больше заглушки для пересылки, поэтому ваш размер вычислений соответствует размеру записи.источник
CREATE TABLE tbl (i TINYINT NOT NULL PRIMARY KEY)
так что это просто общее правило для всех строк, являются ли они частью кучи или нет?alter table ... drop constraint
), и операция не является полной перестройкой (верхние страницы b-дерева отбрасываются, оставшиеся листовые страницы не связываются, а в результате получается куча), поэтому логика резервирования по-прежнему применяется. ,Приятно иметь ухо автора. :-) Kalen подозревает, что это просто применение некоторой минимальной длины строки, где все <9 дополняется до 9. Конечно, есть только несколько случаев, когда это возможно. Вы найдете этот фантомный байт для TINYINT и BIT, а также для VARCHAR (1) / CHAR (1). Если вы перейдете к SMALLINT или CHAR (2), оно не увеличится больше 9, но увеличится, если вы перейдете, скажем, к CHAR (3).
По сути, вы можете указать на эффективность, которую вы можете получить, мудро выбирая типы данных, но отметьте, что есть некоторые крайние случаи, когда правила не выполняются из-за других факторов на уровне хранения.
РЕДАКТИРОВАТЬ Я надеюсь иметь более конкретную информацию для вас. Просто хотел сообщить, что именно об этом сейчас думает автор книги Internals. Она не уверена на 100%.
источник