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 上测试
归档时间: |
|
查看次数: |
1795 次 |
最近记录: |