SQL Server:如何创建一个填充 8 KB 页的表?

jra*_*ara 6 sql-server data-pages

有没有办法计算填充 SQL Server 中 8 KB 页的数据量并创建一个完全填充一页的表?这篇博文中介绍了这种表格。

gbn*_*gbn 11

一行最大为 8060 字节,但包含行开销。

CREATE TABLE dbo.FullPage1 (
    ID int NOT NULL,
    filler1 char(8000) NOT NULL,
    filler2 char(49) NOT NULL)
GO
Run Code Online (Sandbox Code Playgroud)

如果您将filler2 更改为char(50),它会与

创建或更改表“FullPage1”失败,因为最小行大小为 8061,包括 7 个字节的内部开销。这超出了 8060 字节的最大允许表行大小。

8060 覆盖所有列。除了 NULL 位图外没有列开销(见下文)

CREATE TABLE dbo.FullPage3 (
    ID int NOT NULL,
    filler1 char(2683) NOT NULL,
    filler2 char(2683) NOT NULL,
    filler3 char(2683) NOT NULL)
GO
Run Code Online (Sandbox Code Playgroud)

此处,数据为 8053 字节,开销为 2 字节记录类型)+ 2 字节 NULL 位图指针 + 3 字节 NULL 位图。

即使我们没有 NULLable 列,NULL 位图也存在。当我们添加一个 NULLable 列时,我们不会增加行大小。

CREATE TABLE dbo.FullPage3 (
    ID int NOT NULL,
    filler1 char(8000) NOT NULL,
    filler2 char(49) NOT NULL,
    filler3 varchar(8000) NULL)
GO
Run Code Online (Sandbox Code Playgroud)

这当然会发出警告

警告:表“FullPage3”已创建,但其最大行大小超过了允许的最大值 8060 字节。

NULL 位图是“每列一位”。不只是 NULLable 列。取消对filler6v 的注释,它失败了“......包括8个字节的内部开销......”

CREATE TABLE dbo.FullPage4 (
    ID int NOT NULL,
    filler1 char(8000) NOT NULL,
    filler2 char(49) NOT NULL,
    filler1v varchar(10) NULL,
    filler2v varchar(10) NULL,
    filler3v varchar(10) NULL,
    filler4v varchar(10) NULL,
    --filler6v varchar(10) NULL,
    filler5v varchar(10) NULL
    )
GO
Run Code Online (Sandbox Code Playgroud)

有关磁盘结构的更多信息,请参阅存储引擎内部:记录剖析。有趣的是,4 字节的行标题在哪里?这似乎被排除在 8060 字节之外。

在 SQL Server 2008 SP1 和 SQL Server 2005 SP3 上测试