下面是我创建的表,然后详细讲解如何通过这两个命令,查看该表的页分布情况以及每个页里的具体信息。
CREATE TABLE Customers
(
FirstName CHAR(50) NOT NULL,
LastName CHAR(50) NOT NULL,
Address CHAR(100) NOT NULL,
ZipCode CHAR(5) NOT NULL,
Rating INT NOT NULL,
ModifiedDate DATETIME NOT NULL,
)
GO
INSERT INTO dbo.Customers
( FirstName ,
LastName ,
Address ,
ZipCode ,
Rating ,
ModifiedDate
)
VALUES ( 'yuzk' , 'Tu' ,'hubeiwuhan', '0000' ,1 ,getdate())
首先使用命令:DBCC IND
语法如下:
DBCC IND ( { 'dbname' | dbid }, { 'objname' | objid },{ nonclustered indid | 1 | 0 | -1 | -2 } [, partition_number] )
DBCC IND的四个参数含义分别如下:
第一个参数:是数据库名或数据库ID。
第二个参数:是数据库中的对象名或对象ID,对象可以是表或者索引视图。
第三个参数:是一个非聚集索引ID或者 1, 0, 1, or 2,其具体的含义见括号内的描述
(
0: 只显示对象的in-row data页和 in-row IAM 页。
1: 显示对象的全部页,
包含IAM 页, in-row数据页, LOB 数据页row-overflow 数据页 .
如果请求的对象含有聚集索引则索引页也包括。
-1: 显示全部IAM页,数据页, 索引页 也包括 LOB 和row-overflow 数据页。
-2: 显示全部IAM页。
Nonclustered index ID:
显示索引的全部 IAM页, data页和索引页,包含LOB和 row-overflow数据页。
)
第四个参数:是可选的,该参数用于指定一个分区号.如果不给定值或者给定0, 则显示全部分区数据。(这个参数是为了兼容sql server 2000)
示例:
可以看到有2条记录,一条记录为页面类型(PageType)为10的页和一条记录为页面类型(PageType)为1的页。页面类型(PageType)10是IAM页,页ID为141748,页面类型(PageType)1是数据页,它的页ID是 141747.
DBCC PAGE命令
语法如下:
DBCC Page ({dbid|dbname},filenum,pagenum[,printopt])
DBCC PAGE的四个参数含义分别如下:
dbid|dbname:页面的数据库ID或者数据库的名称
filenum:包含页面的文件编号
pagenum 文件内的页面
printopt 可选的输出选项,这里有四个值可以选,该选项默认值为0
0:输出BUFFER,page header,Allocation Status
1:输出BUFFER、page header,Allocation Status,
Data,行偏移量表
2:输出BUFFER、page header,Allocation Status,
Data(包含十六进制dump),行偏移量表
3:输出BUFFER、page header,Allocation Status,
Data(包含每行的列的分布情况)
另外:
要想看到这些输出的结果,还需要设置DBCC TRACEON(3604)。
示例:
接着上面的例子,我们来查看上
现在我们来使用DBCC PAGE命令来查看页ID为141747,页类型为1数据页里存放的数据
DBCC TRACEON(3604)
DBCC PAGE(InternalStorageFormat,1,141747,1)
这里的命令的最后一个参数是1,所以输出四个部分:
第1部分是BUFFER:里面是一些内存分配信息
第2部分是页头(page header):96 bytes大小的页头
第3部分是数据区:Allocation Status,Data
第4部分是行偏移数组表
输出的信息比较多,我这里着重介绍几个关键信息
第一部分:
第二部分:
备注:
这里的可用空间偏移量实际上就是已经使用的空间,这里的空间包括页头的96bytes和
数据的224bytes
第三部分:
备注:
这一部分后面会单独讲GAM,SGAM,PFS,大概提下:
SQL Server IO最小的单位是页,连续的8个页是一个区。
SQL Server需要一种方式来知道其所管辖的数据库中区的使用情况,
这就是GAM页和SGAM页,用来标记哪些区使用,哪些区没有使用的页。
而PFS页是用来跟踪页分配的情况的。
当分配页时,数据库引擎使用GAM与SGAM来确定有可用页的区。
一旦数 据库引擎找 到有可用页的区,
它使用PFS页来确定在那个区里未分配的页,页里可用空间量是多少
第四部分:
这里因为只有一行数据,所以起始的数据的偏移量是96,就是页头的大小。
长按下方二维码可以加关注