我继续在许多论坛和许多博客中阅读,这些页面的包含如下所示:页面大小:16 x 512b = 8192b页面标题:= 96b最大in_row cow:= 8060b

这留下了(8192-96-8060)b = 36b。

好的,这是合乎逻辑和正确的。我有这个问题是:为什么这么多人说剩余的36b是为插槽阵列保留的?

显然,插槽阵列在页面上每行2B。因此,它可以小至2B,并且大于1472b:

2B:1行 * 2b = 2b

1472b:8096b = n*9b(带开销的最小行尺寸...想想单个tinyint列) + n*2b(插槽阵列每行成本)=> 8096 = 11n => n => n = 8096 /11 = 736。

736*2b = 1472b。

由于14B版本标签,这使我达到20。

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

另一个例子。如果您从49岁到50,则将获得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中,此问题仍然存在。 http://www.sqlskills.com/blogs/kimberly/a-simple-start-tart-table-cereation-best-------------.

有帮助吗?

解决方案

如果将页面用于内部用途,例如排序运行,则 最大行大小为8094字节. 。对于数据页,包括内部行开销(包括内部行)的最大行内大小为 8060字节.

如果使用某些引擎功能,内部行开销可以显着扩展。例如,使用 稀疏列 将用户可访问的数据大小减少到8019字节。

我知道SQL Server 2012的外部行开销的唯一示例是14个字节 版本为行. 。该外部间接费用将单行的最大空间使用到8074字节,加上单个插槽阵列条目的2个字节,总计8076字节。这仍然小于8096限制(8192页尺寸-96字节固定标头)的20个字节。

最有可能的解释 是原始的8060字节限制剩下34个字节用于将来的扩展,其中14个用于行变为行实现。

许可以下: CC-BY-SA归因
不隶属于 dba.stackexchange
scroll top