Массив слотов и общий размер страницы

13

Я продолжаю читать на многих форумах и во многих блогах, что страница состоит из страницы, показанной ниже: Размер страницы: 16 x 512B = 8192B Заголовок страницы: = 96B Максимальная строка In_Row: = 8060B

Это оставляет (8192 - 96 - 8060) B = 36B.

Хорошо, это логично и правильно. У меня такой вопрос: почему так много людей говорят, что оставшиеся 36B зарезервированы для массива слотов?

Очевидно, массив слотов дает 2B на строку на странице; Итак, он может быть как 2B, так и 1472B:

2B: 1 строка * 2B = 2B

1472B: 8096B = n * 9B (минимальный размер строки с накладными расходами ... например, один столбец TINYINT) + n * 2B (стоимость массива слотов на строку) => 8096 = 11n => n = 8096/11 = 736.

736 * 2B = 1472B.

Это дает мне 20 из-за тега версии 14B.

USE master ;
GO

CREATE DATABASE test ;
GO

USE test ;
GO

ALTER DATABASE test
    SET ALLOW_SNAPSHOT_ISOLATION ON ;
GO

ALTER DATABASE test
    SET READ_COMMITTED_SNAPSHOT ON ;
GO

DROP TABLE tbl ;
GO

CREATE TABLE tbl
(
      i CHAR(8000) DEFAULT(REPLICATE('a',8000))
    , j CHAR(53)   DEFAULT(REPLICATE('a',53))
) ;

INSERT INTO tbl 
    DEFAULT VALUES ;
GO

DBCC IND (test,tbl,-1) ;
GO
DBCC TRACEON(3604) ;
GO
DBCC PAGE(test,1,272,3) ;
GO

Другой пример. Если вы перейдете к 50 из 49, вы получите VARCHAR (MAX), идущий к LOB_DATA.

DROP TABLE tbl ;
GO

CREATE TABLE tbl
(
      i VARCHAR(MAX) DEFAULT(REPLICATE('a',8000))
    , j CHAR(49)   DEFAULT(REPLICATE('a',49))
) ;

sp_tableoption N'tbl', 'large value types out of row', 'OFF' ;
GO

INSERT INTO tbl 
    DEFAULT VALUES ;
GO

DBCC IND (test,tbl,-1) ;
GO
DBCC TRACEON(3604) ;
GO
DBCC PAGE(test,1,272,3) ;
GO

Похоже, что эта проблема остается, даже в SQL Server 2012. @SQLKiwi указывает на этот пост Кимберли Трипп - http://www.sqlskills.com/blogs/kimberly/a-simple-start-table-creation-best-practices / .

ooutwire
источник
Комментарии не для расширенного обсуждения; этот разговор был перенесен в чат .
Пол Уайт 9

Ответы:

8

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

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

Единственный пример внешних издержек на строки, которые я знаю до SQL Server 2012, - это 14 байтов, необходимых для версионных строк . Эти внешние издержки приводят к максимальному использованию пространства для одной строки до 8074 байтов плюс 2 байта для записи массива с одним слотом, что составляет всего 8076 байтов. Это все еще на 20 байтов меньше предела 8096 (размер страницы 8192 - фиксированный заголовок 96 байтов).

Наиболее вероятным объяснением является то , что первоначальный предел 8060 байт осталось 34 байт для расширения в будущем, из которых 14 были использованы для рядной версий реализации.

Пол Уайт
источник