积极答复者
关于页的一些疑问

问题
答案
-
首先微软的文档没有说每页的页数据是8060字节,而是说“The maximum amount of data and overhead that is contained in a single row on a page is 8,060 bytes (8 KB). ” ,相关的说明跟页面的结构图可以查看下面。
msdn.microsoft.com/en-us/library/ms190969(v=sql.105).aspx
如果你能了解行偏移表的作用,那你就自然能了解行偏移表是固定的还是不固定的。
偏移表的作用是只指向页面中每行数据起始位置,每行占据偏移表的2个字节,假如行偏移表固定是36个字节的话,那么如果那个页面超过18行的话,怎么办?所以显然是不固定的。
- 已编辑 Michael CS 2012年11月7日 8:36
- 已标记为答案 Guanjm 2012年11月7日 9:21
全部回复
-
首先微软的文档没有说每页的页数据是8060字节,而是说“The maximum amount of data and overhead that is contained in a single row on a page is 8,060 bytes (8 KB). ” ,相关的说明跟页面的结构图可以查看下面。
msdn.microsoft.com/en-us/library/ms190969(v=sql.105).aspx
如果你能了解行偏移表的作用,那你就自然能了解行偏移表是固定的还是不固定的。
偏移表的作用是只指向页面中每行数据起始位置,每行占据偏移表的2个字节,假如行偏移表固定是36个字节的话,那么如果那个页面超过18行的话,怎么办?所以显然是不固定的。
- 已编辑 Michael CS 2012年11月7日 8:36
- 已标记为答案 Guanjm 2012年11月7日 9:21
-
SQL SERVER会保证能放置的行数可以让偏移表都可以指向到,如果放不下了,那相应的行跟偏移表都会移到另外一页。等下我给你做个实验。
All kinds of RDMS are similar,but the DBAs are different.
- 已编辑 Michael CS 2012年11月7日 9:25
-
use tempdb
go
create table t1(c1 char(8))
insert into t1 values('A')
GO 540c1 长度为8bytes,每行数据的overhead 为7 bytes (为什么为7?所有的列为固定长度,并且列数不超过8的行的overhead 都为7 bytes )
这样每行数据的长度为15bytes , 所以理论上每页可以容纳 8096/15= 540 行
然后我们执行
DBCC TRACEON(3604)
DBCC IND([tempdb], 't1', -1)
DBCC TRACEOFF(3604)从执行结果可以看到 数据页为2页
PageFID PagePID IAMFID IAMPID ObjectID
1 142 NULL NULL 407672500
1 146 1 142 407672500
1 200 1 142 407672500再执行下面
DBCC TRACEON(3604)
DBCC PAGE([tempdb], 1, 146, 1)
DBCC TRACEOFF(3604)结果中可以看到 m_slotCnt = 453 ,这说明只存放了 453 行
再执行下面
DBCC TRACEON(3604)
DBCC PAGE([tempdb], 1, 200 , 1)
DBCC TRACEOFF(3604)结果中可以看到 m_slotCnt = 87
正好满足453 +87 =540
All kinds of RDMS are similar,but the DBAs are different.
- 已编辑 Michael CS 2012年11月7日 11:07