jrara Asked: 2011-06-20 22:50:43 +0800 CST2011-06-20 22:50:43 +0800 CST 2011-06-20 22:50:43 +0800 CST SQL Server:如何创建一个填满 8 KB 页的表? 772 有没有办法计算填充 SQL Server 中一个 8 KB 页的数据量并创建一个完全填充一页的表?此类表在此博客文章中介绍。 sql-server data-pages 1 个回答 Voted Best Answer gbn 2011-06-20T23:25:40+08:002011-06-20T23:25:40+08:00 一行最大为 8060 字节,但包含行开销。 CREATE TABLE dbo.FullPage1 ( ID int NOT NULL, filler1 char(8000) NOT NULL, filler2 char(49) NOT NULL) GO 如果您将 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 这里,数据为 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 这当然会发出警告 警告:表“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 有关磁盘结构的更多信息,请参阅存储引擎内部:记录剖析。有趣的是,4 字节的行标题在哪里?这似乎被排除在 8060 字节之外。 在 SQL Server 2008 SP1 和 SQL Server 2005 SP3 上测试
一行最大为 8060 字节,但包含行开销。
如果您将 Filler2 更改为 char(50) 它会中断
8060 遍及所有列。除了 NULL 位图外,没有列开销(见后文)
这里,数据为 8053 字节,开销为 2 字节记录类型)+ 2 字节 NULL 位图指针 + 3 字节 NULL 位图。
即使我们没有 NULLable 列,NULL 位图仍然存在。当我们添加一个 NULLable 列时,我们不会增加行大小。
这当然会发出警告
NULL 位图是“每列一位”。不仅仅是 NULLable 列。取消注释filler6v,它失败了“......包括8字节的内部开销......”
有关磁盘结构的更多信息,请参阅存储引擎内部:记录剖析。有趣的是,4 字节的行标题在哪里?这似乎被排除在 8060 字节之外。
在 SQL Server 2008 SP1 和 SQL Server 2005 SP3 上测试