关于数据库页类型如下所示:
类型 | 页面类型名称 | 页面类型描述 |
1 | Data page | 堆表和聚集索引的叶子节点数据 |
2 | Index page | 聚集索引的非叶子节点和非聚集索引的所有索引记录 |
3 | Text mixed page | A text page that holds small chunks of LOB values plus internal parts of text tree. These can be shared between LOB values in the same partition of an index or heap. |
4 | Text tree page | A text page that holds large chunks of LOB values from a single column value. |
7 | Sort page | 排序时所用到的临时页,排序中间操作存储数据用的。 |
8 | GAM page | 全局分配映射(Global Allocation Map,GAM)页面 这些页面记录了哪些区已经被分配并用作何种用途。 |
9 | SGAM page | 共享全局分配映射(Shared Global Allocation Map,GAM)页面 这些页面记录了哪些区当前被用作混合类型的区,并且这些区需含有至少一个未使用的页面。 |
10 | IAM page. | 有关每个分配单元中表或索引所使用的区的信息 |
11 | PFS page. | 有关页分配和页的可用空间的信息 |
13 | boot page. | 记录了关于数据库的信息,仅存于每个数据库的第9页 |
15 | file header page | 记录了关于数据库文件的信息,存于每个数据库文件的第0页 |
16 | DCM page | 记录自从上次全备以来的数据改变的页面,以备差异备份 |
17 | BCM page | 有关每个分配单元中自最后一条 BACKUP LOG 语句之后的大容量操作所修改的区的信息 |
实际上SQLServer还包括一些未公开的页面类型,例如type 19,type 14等等。
本章我们主要介绍GAM页和SGAM页,其他页面类型会稍后介绍。
那么如何查看页面信息呢,从SQLServer2000起便开始提供了一个读取数据页结构的命令DBCC Page。该命令为非文档化的命令,具体如下:
DBCC Page ({dbid|dbname},filenum,pagenum[,printopt])
具体参数描述如下:
dbid 包含页面的数据库ID
dbname 包含页面的数据库的名称
filenum 包含页面的文件编号
pagenum 文件内的页面
printopt 可选的输出选项;选用其中一个值:
0:默认值,输出缓冲区的标题和页面标题
1:输出缓冲区的标题、页面标题(分别输出每一行),以及行偏移量表
2:输出缓冲区的标题、页面标题(整体输出页面),以及行偏移量表
3:输出缓冲区的标题、页面标题(分别输出每一行),以及行偏移量表;每一行后跟分别列出的它的列值
如果要想看到这些输出的结果,还需要设置DBCC TRACEON(3604)。
如前文所述,GAM页一定存在于该数据库的第二个页面,SGAM页则一定存在于该数据库的第三个页面;而每一个数据库都会存在文件编号为1的数据库文件,所以我们执行以下命令即可。
DBCC PAGE(TESTDB,1,2,1) —查看GAM页信息
DBCC PAGE(TESTDB,1,3,1) —查看SGAM页信息
DBCC PAGE(TESTDB,1,2,2) —查看GAM页信息和整体输出页面
DBCC PAGE(TESTDB,1,3,2) —查看SGAM页信息和整体输出页面
DBCC PAGE(TESTDB,1,2,3) —查看GAM页信息及相应列值
DBCC PAGE(TESTDB,1,3,3) —查看SGAM页信息及相应列值
DBCC PAGE(TESTDB,1,2,1) WITH TABLERESULTS —以表格形式查看SGAM页信息及相应列值
DBCC PAGE(TESTDB,1,3,1) WITH TABLERESULTS —以表格形式查看SGAM页信息及相应列值
我们可以看到一个完整的页面分为四个部分;BUFFER、PAGE HEADER、DATA和OFFSET TABLE。
让我们首先从GAM页开始看起:
BUFFER部分:
显示给定页面的缓冲信息,是内存中的结构,用于管理页面,该信息仅当该页面处于内存时才有意义。关于这个部分我们知之甚少,基本上无法找到相关材料。
BUF @0x03585CD8 | 每一次清空缓存再次查询,地址都会改变 |
bpage = 0x060B4000 | 每一次清空缓存再次查询,地址都会改变 |
bhash = 0x00000000 | 相对不变 |
bpageno = (1:2) | 当前页面地址 |
bdbid = 8 | sys.databases.database_id |
breferences = 1 | 每一次清空缓存再次查询,地址都会改变 |
bUse1 = 41490 | 每一次清空缓存再次查询,地址都会改变 |
bstat = 0xc00009 | 相对不变 |
blog = 0x59ca2159 | 相对不变 |
bnext = 0x00000000 | 相对不变 |