插槽阵列和总页面大小


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 * 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中@SQLKiwi点,这个职位由金佰利特里普- http://www.sqlskills.com/blogs/kimberly/a-simple-start-table-creation-best-practices /


评论不作进一步讨论;此对话已转移至聊天
保罗·怀特9

Answers:


8

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

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

我知道直到SQL Server 2012外部行开销的唯一示例是版本化行所需的14个字节。这种外部开销使单个行的最大空间使用量达到8074字节,再加上单个插槽阵列条目的2个字节,使总计8076字节。仍比8096限制(8192页大小-96字节固定标头)少20个字节。

最可能的解释是,原来的8060字节的限制留下34个字节为将来的扩展,它被用于行版本实现14。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.