我继续在许多论坛和博客中读到一个页面构成,如下所示:页面大小: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 /。