Масив слотів та загальний розмір сторінки


13

Я продовжую читати на багатьох форумах і в багатьох блогах, що сторінка складається, як показано нижче: Розмір сторінки: 16 x 512B = 8192B Заголовок сторінки: = 96B Максимальна кількість рядків: = 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 * 2В = 1472В.

Це отримає мені до 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, то ви отримаєте ВАРХАР (МАКС), який переходить до 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 / .


Коментарі не для розширеного обговорення; ця розмова була переміщена до чату .
Пол Білий 9

Відповіді:


8

Якщо сторінки використовуються для внутрішніх цілей, наприклад прогонів сортування, максимальний розмір рядка - 8094 байт . Для сторінок даних максимальний розмір рядка, включаючи внутрішній накладний рядок, становить 8060 байт .

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

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

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.