Tiny Integer Распределение пространства на SQL сервере - PullRequest
1 голос
/ 27 апреля 2020

Я немного запутался в том, как tinyint размер типа данных выделяется на SQL сервере.

Я создал таблицу Temp и повторил значения 255 более 10000 раз. Я получил вывод в зарезервированном столбце как 136 kb и данные как 120 kb.

Когда я повторяю одно и то же значение 255 более 12000 раз, я получаю вывод в зарезервированном столбце как 200 kb и данные как 144 kb.

drop table TEMP
GO

create table TEMP
(
    ids tinyint
)
GO

insert into TEMP
values('255')
go 10000

sp_spaceused 'TEMP'
go

1 Ответ

3 голосов
/ 27 апреля 2020

SQL Сервер сохраняет строки на страницах размером 8 КБ.

Все созданные вами строки идентичны и выглядят следующим образом

10 00 05 00 FF 01 00 00 00 
  • 10 Биты состояния A
  • 00 Биты состояния B
  • 0500 Смещение числа столбцов
  • FF - фактическое крошечное целое число
  • 0100 - количество столбцов
  • 00 - Нулевое растровое изображение
  • 00 - Заполнение для соответствия минимальному размеру строки 9 байт

Обратите внимание, что tinyint само значение просто занимает 1 байт на строку, и есть дополнительные 8 байтов метаданных на строку.

Кроме того, есть дополнительные издержки на странице для 96-байтового заголовка страницы и дополнительные 2 байта на строку в нижнем колонтитуле для массив слотов.

В результате SQL Сервер может хранить только максимум (8192-96) / 11 строк на страницу (736) и в действительности после вставки 700-й строки и заполнения страницы более 95%. затем страница PFS сообщает, что страница данных имеет размер 100_PCT_FULL, то есть максимальное число строк на странице, достигаемое здесь с помощью вставок из одного элемента.

10000/700 означает, что для этого требуется 14,3 страницы хранить строки. В SQL Server 2012 первые 8 страниц будут выделены из смешанных экстентов, а затем страницы будут выделены в полных экстентах.

Так что, вероятно, ваши 136 КБ будут состоять из 17 страниц по 8 КБ следующим образом

  • 8 страниц в смешанных экстентах
  • 1 страница IAM
  • 8 страницы с одинаковым экстентом (с 1,7 страниц свободными)

Как только 1,7 страницы будут заполнены, будет предоставлен новый единый экстент. Это 64 КБ и объясняет переход с 136 КБ до 200 КБ

...