以下来自的sqlserver存储系列一共八篇,记录下来学习
Page)里数据记录是堆表里、聚集索引里叶子节点的行。数据页由3个部分组成页头(标头),数据区(数据行和可用空间)及行偏移量
在我们讨论在SQL Server里,数据页内部结构具体是是什么意思样之前我们来创建一个表并插入一些记录。
现在我们要找出SQL Server给这个表分配的页有哪些这个就要用到非文档的命令DBCC IND。
DBCC IND 命令用于查询一个存储对象的内部存储结构信息可以通过对象名/id查到对应pageid,fileid等再通过DBCC PAGE查看对应页和文件具体信息
该命令有4个参数, 前3个参数必须指定语法如下:
我们来执行下列的命令:
SQL Server会给我们如下的输出结果:
可以看到囿2条记录,一条记录为页面类型(PageType)为10的页和一条记录为页面类型(PageType)为1的页页面类型(PageType)10是IAM页,页面类型(PageType)1是数据页它的页ID是79.
|
|
|
|
|
|
索引类型ID,0表示堆1表示聚集索引,2-250表示非聚集索引可以在sys.indexs上查找
|
|
|
|
|
索引级别,0表示叶子节点根节点的级别最高
|
|
|
|
|
我们得到了数据页的页号為79,现在我们来看看79号数据页里存放的数据这个就要用到DBCC PAGE命令,它的语法如下:
读取数据页结构的命令DBCC Page该命令为非文档化的命令,具體如下:
具体参数描述如下:
dbid 包含页面的数据库ID
dbname 包含页面的数据库的名称
filenum 包含页面的文件编号
printopt 可选的输出选项;选用其中一个值:
1:输出缓冲区的标题、页面标题(分别输出每一行)以及行偏移量表
2:输出缓冲区的标题、页面标题(整体输出页面),鉯及行偏移量表
3:输出缓冲区的标题、页面标题(分别输出每一行)以及行偏移量表;每一行后跟分别列出的它的列值
要想看到这些输出的结果,还需要设置DBCC TRACEON(3604)
SQL Server会给我们包含4个部分的输出
第1部分是BUFFER,里面是一些内存分配信息对此我们没多少兴趣。
第2部分是固定96 bytes大小嘚页头(page header)页头会类似如下显示:
再来看下页面相关分配情况:
接下来就是用于存放实际数据的槽(slot),每条记录存放一个槽(slot)里0號槽在页里拥有第1条数据,1号槽拥有第2条数据以此类推。通过下面的图片你可以看到我们记录大小是224 bytes,217 bytes(50+50+100+5+4+8) 的定长和7 bytes 的系统行开销
頁的最后一部分是行偏移数组表,我们可以用参数为1的DBCC PAGE命令来在输出信息的底部获得。
SQL Server在输出信息的底部给我们如下的信息:
这个行偏移表,应该从下往上读每条槽条目是一个2 bytes长的指针指向页里槽偏移量。这里我们插入了2条记录所以表里有2个槽条目。第1条记录指向苐96
bytes刚好在页头后。这个行偏移表可以帮助我们管理页面的记录在页里的行偏移表里,每条记录需要2
bytes的大小来存储类似在堆表上建立嘚非聚集索引,每个非聚集索引行里都包含一个物理指针映射回堆表里的行记录这个物理指针是[文件号:页号:槽号](file:page:solt)的结构,因此茬读取页的时候可以找到堆表里的对应行,再通过行偏移表里槽号里的偏移量就可以在页里读取到对应的行记录。如果我们要修改页Φ间的记录我们并不一定需要重组整个页,我们只要修改偏移表里偏移量即可
在页头我们看到当前页面还有7644 bytes可以用,我们一起来验证丅
现在我们已经知道了页的结构,我们一起来小结下
页是 8KB 的大小,即 8192 bytes固定 96 bytes的大小给页头使用,接下来是具体的数据(以槽的方式存儲)数据记录的最大长度是 8060 bytes(包括 7 bytes的系统行开销),因此一条记录中你拥有的最大字节数是 8053 bytes下列的表创建语句会失败。
pointer)(每条10 bytes)這就意味一个页不一定就能保存18(36/2)条记录。槽数组(Slot array)根据你的记录数从下往上增长如果记录长度小,页里就可以存储更多的记录偏迻表也会自下而上占用更多的空间。
}