图片 13

Server内部原因之数据页,领会数据页结构

数据页是满含已增加到数据库表中的客商数量的结构。

我们都很清楚SQL Server用8KB
的页来囤积数据,而且在SQL Server里磁盘 I/O 操作在页级实施。也正是说,SQL
Server
读取或写入全部数据页。页有区别的花色,像数据页,GAM,SGAM等。在此作品里,让我们意气风发道来驾驭下数据页结构。

【IT168专稿】提起GAM和SGAM,大家只能从数据库的页和区聊起。多个数据库由客商定义的空间组成,那么些空中用来长久存款和储蓄客户对象,比方数据库管理音信、表和目录。这一个空中被分配在叁个或多少个操作系统文件中。

如前所述, 数据页有三种, 每一个都是分歧的格式存款和储蓄数据。

SQL
Server把数据记录存在数据页(Data
Page卡塔尔里。数据记录是堆表里、集中索引里叶子节点的行。

  当大家创设二个数据库的时候,比如以缺省的不二等秘书技CREATE DATABASE
TESTDB,SQLServer自动帮大家创立好如下四个数据库文件。

SQL server 有行内数据页、行溢出数据页和 LOB 数据页。

数码页由3个部分组成。页头(标头卡塔 尔(英语:State of Qatar),数据区(数据行和可用空间卡塔 尔(阿拉伯语:قطر‎及行偏移数组。

图片 1
 

与 SQL server 中的全数其余类型的页相像, 数据页的深浅固定为 8 KB
或8192字节。

图片 2

  那四个数据文件是确实的操作系统文件,个中八个是叫行数据文件,用来积攒数据库的各个对象,别的一个是日记文件,一直记录数据变动的长河。

它们由三最主要组件组成: 页面页眉、数据行和行偏移量数组, 如图6-4 所示。

在我们斟酌在SQL
Server里,数据页内部结构具体是什么以前,大家来创造贰个表并插入一些记录。

  从逻辑角度来说,数据库的纤维存款和储蓄单位为页即8kb。

图片 3

 

  数据库被分成若干逻辑页面(每一种页面8KB),并且在各样文件中,全部页面都被接连地从0到x编号,个中x是由文件的高低决定的。大家能够通过点名三个数据库ID、叁个文本ID、三个页码来援引任何贰个数据页。每一种数据页则用来存储表和目录,以致有关的数据库管理音信。

 

 1 USE [InternalStorageFormat]
 2 GO
 3 
 4 IF EXISTS ( SELECT  *
 5             FROM    sysobjects
 6             WHERE   id = OBJECT_ID(N'[dbo].[Customers]')
 7                     AND OBJECTPROPERTY(id, N'IsUserTable') = 1 )
 8     DROP TABLE dbo.Customers
 9 
10 CREATE TABLE Customers
11 (
12    FirstName CHAR(50) NOT NULL,
13    LastName CHAR(50) NOT NULL,
14    Address CHAR(100) NOT NULL,
15    ZipCode CHAR(5) NOT NULL,
16    Rating INT NOT NULL,
17    ModifiedDate DATETIME NOT NULL,
18 )
19 GO
20 
21 
22 INSERT INTO dbo.Customers
23         ( FirstName ,
24           LastName ,
25           Address ,
26           ZipCode ,
27           Rating ,
28           ModifiedDate
29         )

30 VALUES  ( 'Woody' , -- FirstName - char(50)
31           'Tu' , -- LastName - char(50)
32           'ZUOQIAO YOUXI TOWN LINHAI CITY' , -- Address - char(50)
33           '0000' , -- ZipCode - char(5)
34           1 , -- Rating - int
35           '2015-05-07 10:09:51'  -- ModifiedDate - datetime
36         )
37         go 2

  我们本着上面数据文件的门道能够找到该公文,观望一下新建的数据文件的抑扬顿挫为:

页标题

今日我们要寻觅SQL
Server给这几个表分配的页有怎么样,这一个将在采用非文书档案的通令DBCC
IND。
它的语法如下:

  2.18 MB (2,293,760 字节)=2,293,760b/8kb=280个页面=35个区

 

DBCC IND
命令用于查询一个囤积对象的里边存款和储蓄结构音讯,该命令有4个参数,
前3个参数必得钦命。语法如下:
DBCC IND ( { ‘dbname’ | dbid }, { ‘objname’ | objid },{ nonclustered
indid | 1 | 0 | -1 | -2 } [, partition_number] )
第一个参数是数据库名或数据库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数据页。
为了同盟sql server
二〇〇三,第五个参数是可选的,该参数用于钦点二个分区号.假设不给定值或许给定0,
则展现整个分区数据。
和DBCC PAGE不一致的是, SQL Server运转DBCC
IND没有供给开启3604追踪标记.

  数据库举办空间管理的微小单位为区(extents)。

如图6-4 所示, 页标题吞噬各种数据页的前玖拾玖个字节
(为数据、行费用和行偏移保留8098个字节)。表6-5
列出了自己商议页标题时显得的一些新闻。

作者们来举行下列的授命:

  一个区由8个逻辑上三番五次的页面组成(64KB的空间)。为了能够更使得地分配空间,SQL
Server 二零零六不会为一点点的多少向数据表分配整区的长空。SQL Server
二〇〇八有二种等级次序的区。

图片 4

1 DBCC IND('InternalStorageFormat','Customers',-1)

  统后生可畏类型的区
那几个区为单个对象具有,区中全部的8个数据页只好被所属对象使用。

 

SQL
Server会给大家如下的出口结果:
图片 5

  混合类型的区 这几个区能为最多8个目的分享。

行内数据的数据行

能够看出有2条记下,一条记下为页面类型(PageType卡塔 尔(阿拉伯语:قطر‎为10的页和一条记下为页面类型(PageType卡塔尔为1的页。页面类型(PageType)10是IAM页,页面类型(PageType卡塔 尔(英语:State of Qatar)1是数据页,它的页ID是79.

  SQL
Server为新的表或索引从混合类型的区中分配页面。当该表或索引增进到8个页面时,今后全体的分配都选取统意气风发类型的区。

 

至于数据库页类型如下所示:

  当一张表或三个目录供给更加多的空间时,SQL
Server需求找到能够用来分配的长空。借使该表或索引全体依然有限8个页面,SQL
Server必须找到能够用来分配的插花类型区构成的空中。假使表或索引有8个页面或越来越大,SQL
Server必需找到一个私自的群集类型的区。

页题近年来面是积存表实际数据行的区域。单个数据行的最大尺寸为8060字节的行内数据。

  • 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卡塔 尔(英语:State of Qatar)页面
    这一个页面记录了怎样区已经被分配并用作何种用处。

  • 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 语句之后的大容积操作所校正的区的新闻

  SQL
Server使用三种极其类其他页面来记录哪些区已经被分配出去了,哪些类型(混合类型或合并类型)的区可供使用:

行仍可以在单独的页上存款和储蓄行溢出和 LOB 数据。

现今大家来拜会79号项目为1的多寡页里寄放的数据,这几个就要用到DBCC
PAGE命令,它的语法如下:

  全局分配映射(Global Allocation Map,GAM)页面
那个页面记录了怎么区已经被分配并用作何种用项。二个GAM页面在它所隐蔽空间里针对每二个区都有两个多少位。纵然数据位为0,那么相应的区正在使用;如若该多少位为1,那么该区为自由区。一个GAM页面除了页面尾部和其余部分亟需记入的付出大致有8
000字节或许说64 000位空间可用,所以每一种GAM页面能够覆盖64
000个区,也便是概况4GB的数额。这代表二个文本的每4GB空间对应一个GAM页面。

在给定页上囤积的行数依据表结交涉储存的数额而改动。

dbcc page
命令读取数据页结构的一声令下DBCC Page。
该命令为非文书档案化的指令,具体如下:
  DBCC Page ({dbid|dbname},filenum,pagenum[,printopt])
  具体参数描述如下:
  dbid 富含页面包车型地铁数据库ID
  dbname 饱含页面包车型地铁数据库的名号
  filenum 包罗页面包车型地铁文本编号
  pagenum 文件内的页面
  printopt 可选的输出选项;选取在这之中三个值:
  0:私下认可值,输出缓冲区的标题和页面题目
  1:输出缓冲区的标题、页面标题(分别出口每风流倜傥行),以至行偏移量表
  2:输出缓冲区的标题、页面标题(全部出口页面),以致行偏移量表
  3:输出缓冲区的标题、页面标题(分别出口每意气风发行),以致行偏移量表;每后生可畏行
  后跟分别列出的它的列值
  要想看见这么些输出的结果,还亟需安装DBCC TRA总首席营业官N(3604)。

  分享全局分配映射(Shared Global Allocation Map,SGAM)页面
这个页面记录了哪些区当前被看作混合类型的区,并且这一个区需包括最少叁个未接收的页面。就疑似一个GAM页面,每叁个SGAM页面覆盖了大意上64
000个区,也正是大概4GB的多寡。一个SGAM页面在它所覆盖空间里针对每叁个区都有叁个数量位。假使数量位为1,那么相应的被应用的区为混合类型,并且该区有生龙活虎部分随便页面;尽管数据位为0,那么相应的区不是贰个错落类型的区,也许即便是三个混合类型的区,不过富有的页面都已经被选用了。

装有全体固定长度列的表始终能够积存每页相通的行数;

作者们来实践下列的通令:

  表4-2显得了依照每一个区脚下的使用情状,在GAM和SGAM中该区所对应的比特位方式。

可变长度行能够依赖输入数据的实际上尺寸, 存款和储蓄尽恐怕多的行。

1 DBCC TRACEON(3604)
2 DBCC PAGE(InternalStorageFormat,1,79,3)
3 GO    
区的当前使用情况 GAM比特位设置 SGAM比特位设置
自由,未使用 1 0
统一类型或已全部使用的混合区 0 0
含有自由页面的混合区 0 1

保险行长越来越短能够使越来越多行相符页面, 进而收缩 i/o
并追加所需数据在缓存中的恐怕。

SQL
Server会给大家包罗4个部分的出口。第1部分是BUFFE福睿斯,里面是生龙活虎对内部存款和储蓄器分配新闻,对此大家十分少兴趣。下生龙活虎部分是从来96
bytes大小的页头(page header卡塔尔国,页头(page
header卡塔尔国会形似如下显示:

  要是SQL
Server供给找到贰个新的一丝一毫未有选择的区,那么它能够选用其余一个在GAM页面中对应的比特位值为1的区。纵然SQL
Server须要找到三个全数可用空间(有三个或七个随机页面)的混杂类型的区,那么它能够寻找二个一倡百和的GAM中的值为0、SGAM中的值为1的区。即使不设有有可用空间的交集类型的区,SQL
Server会使用GAM页面来搜索八个簇新的区并将其分配为混合类型的区,然后利用该区中的风华正茂页。若是根本未有自由区,那么这些文件已经满了。

 

图片 6

第0页 第1页 第2页 第3页 第4页 第5页 第6页 第7页
m_type=15 m_type=11 m_type=8 m_type=9 m_type=0 m_type=0 m_type=16 m_type=17
头文件页 PFS页 GAM页 SGAM页 保留页 保留页 DCM页 BCM页

行偏移量数组

页头相关字段的含义:

  SQL
Server能够急速地锁定三个文件中的GAM页面,因为它总是位于任何数据库文件的第三页上(页码为2)。SGAM页面是在第四页上(页码为3)。下二个GAM页面出今后率先个GAM页面(页码为2)以后的每511
2二十六个页面中,并且下二个SGAM页面出现在首先个SGAM页面(页码为3)未来的每511
2三12个页面中。每八个数据库文件的页码为0的页面是文件头页面,并且每一个文件唯有生龙活虎页。页码0是头文件页,页码1是页面自由空间页(Page
Free Space,PFS)。

 

  • Page @0x08F84000      
         同BUFFER中的bpage地址
  • m_pageId
    = (1:79)              数据页号     
  • m_headerVersion
    = 1         头文件版本号,一贯为1          
  • m_type =
    1                          页面类型,1为数量页面
  • m_typeFlagBits
    = 0x4         数据页和索引页为4,其余页为0        
  • m_level =
    0                         该页在索引页(B树卡塔 尔(英语:State of Qatar)中的级数
  • m_flagBits
    = 0x8000          页面标识
  • m_objId
    (AllocUnitId.idObj) = 46                       同Metadata: ObjectId 
               
  • m_indexId
    (AllocUnitId.idInd) = 256                  同Metadata:
    IndexId
  • Metadata:
    AllocUnitId =
    72057594040942592  存款和储蓄单元的ID,sys.allocation_units.allocation_unit_id                              

  • Metadata:
    PartitionId =
    72057594039304192   数据页所在的分区号,sys.partitions.partition_id                             

  • Metadata:
    IndexId = 0                                      
     页面包车型大巴索引号,sys.objects.object_id&sys.indexes.index_id

  • Metadata:
    ObjectId = 277576027                    
     该页面所属的目的的id,sys.objects.object_id
  • m_prevPage

    (0:0)                  该数据页的前生龙活虎页面;首要用在数据页、索引页和IAM页

  • m_nextPage
    = (0:0)                
     该数据页的后后生可畏页面;重要用在数据页、索引页和IAM页

  • pminlen =
    221                          定长数据所占的字节数
  • m_slotCnt
    = 2                           页面中的数据的行数
  • m_freeCnt
    = 7644                    页面中剩下的空间
  • m_freeData
    = 544                    从第一个字节到结尾三个字节的空中字节数

  • m_reservedCnt
    = 0                   活动职业释放的字节数

  • m_lsn =
    (255:8406:2)                日志记录号
  • m_xactReserved
    = 0                 最新插手到m_reservedCnt领域的字节数
  • m_xdesId
    = (0:0)                    
      添加到m_reservedCnt的近年的事情id
  • m_ghostRecCnt
    = 0                 幻影数据的行数
  • m_tornBits
    = 0                      
      页的校验位依旧被由数据库页面爱惜格局决定分页保养位代表

  在SQLServer2010的每三个数据库中的前八页顺序都以一定的。

行偏移量数组是2字节项的块, 每一个条款表示相应数据行初步的页面上的偏移量。

再来看下页面相关分配情形:

  除了第9页为数据库的BOOT页以外,从第8页到第173页为SQLServer二〇〇八内部系统表的连锁存款和储蓄信息,然后从第174页到第279页为未分配页面。因为第豆蔻梢头页从0最初,所以刚刚280页,即和咱们看看的数据库数据文件的深浅完全相等。

每行在此个数组中都有一个2字节的条约 (正如前边所商议的,
当您读书每行所需的拾叁个开荒字节时)。

 图片 7

第8页

即便那几个字节未有存款和储蓄在数额行中, 但它们确实会耳濡目染切合页面包车型客车行数。

  • GAM (1:2) = ALLOCATED
                                                   
      在GAM页上的分配景况
  • SGAM (1:3) = ALLOCATED
                                                 
      在SGAM页上的分配景况
  • PFS (1:1) = 0x61
    MIXED_EXT ALLOCATED 
    50_PCT_FULL 在PFS页上的分配意况,该页为百分之七十满,                       

  • DIFF (1:6) =
    CHANGED

  • ML (1:7) = NOT
    MIN_LOGGED   

第8页

 

接下去正是用来存放实际多少的槽(slot卡塔尔国,每条记下贮存二个槽(slot卡塔 尔(阿拉伯语:قطر‎里。0号槽在页里具备第1条数据,1号槽具备第2条数据,依此类推。通过下边包车型地铁图形,你能够看见大家记录大小是224
bytes,217 bytes(50+50+100+5+4+8卡塔尔国 的定长和7 bytes
的种类行费用。

第8页

行偏移量数组提醒页上行的逻辑顺序。

图片 8

第N页

例如, 假使表具备聚焦索引, SQL server 将按集中索引键的顺序存款和储蓄那么些行。

页的结尾大器晚成都部队分是行偏移数组表,大家得以用参数为1的DBCC
PAGE命令来,在出口新闻的底部取得。

第173页

那并不意味着行按集中索引键的依次物理地囤积在页面上。

实行如下的授命:

第279页

反而, 偏移量数组中的插槽0援引聚焦索引键顺序中的第风度翩翩行, 插槽1援引第二行,
就那样类推。

1 DBCC TRACEON(3604)
2 DBCC PAGE(InternalStorageFormat,1,79,3)
3 GO    

m_type=1

正如您在自己切磋实际上页面时所观察的那样,
那些行的情理地点能够放在页面的此外岗位。

SQL
Server在输出音信的尾部,给大家如下的音信:

m_type=13

 

图片 9

m_type in (1,2,10)

翻看数据页

其生龙活虎行偏移表,应该从下往上读。每条槽条款是二个2
bytes长的指针指向页里槽偏移量。这里大家插入了2条记下,所以表里有2个槽条目款项。第1条记下指向第96
bytes,恰幸而页头后。那个行偏移表能够扶助大家管理页面包车型客车笔录。在页里的行偏移表里,每条记下须求2
bytes的分寸来存款和储蓄。于此相近,在堆表上成立的非聚焦索引,每一个非聚焦索引行里都包括二个物理指针映射回堆表里的行记录。那几个物理指针是[文件号:页号:槽号](file:page:solt卡塔 尔(阿拉伯语:قطر‎的组织,由此在读取页的时候,能够找到堆表里的对应行,再经过行偏移表里槽号里的偏移量,就能够在页里读取到相应的行记录。纵然大家要纠正页中间的笔录,大家并不一定需求组合全体页,我们若是改进偏移表里偏移量就可以。

N/A

 

图片 10

Data页

基本上能用 DBCC 页命令查看数据页的内容, 

在页头大家见到日前页面还会有7644
bytes能够用,大家一块来注解下。

Boot页

那允许你查看数据库中任何给定页的页标题、数据行和行偏移表。

(8 * 1024) – 96 – (217 *
2)-(7 * 2)-(2 * 2)=7644 bytes

主要为此中系统表相关音信

只有系统管理员才干选取 DBCC 页。

8 * 1024 =
页的总大小,8K

未分配

只是, 由于日常无需查阅数据页的内容, 因而在 SQL server 文书档案中找不到关于
DBCC 页的新闻。

         96 = 页头大小 96
bytes       

  以下截图是因此SQLServer2009的Internals
Viewer插件看见的全体页面结构,该插件是从

而是, 即使您想接纳它, 上边是语法:

 217 * 2 = 每条记下的总参谋长
* 记录数

  备注:TESTDB为新创设的空数据库,未有其余客户自定义对象,直到有建表脚本甘休;

DBCC PAGE ({dbid | dbname}, filenum, pagenum[, printopt])

     7 * 2 =
每条记下的种类行成本 * 记录数

图片 11
 

 

     2 * 2 =
行偏移表里每槽占用字节数 * 记录数

 

DBCC 页面命令饱含表6-6 中显示的参数。

今日我们早已精晓了页的组织,我们联合来小结下。

       关于数据库页类型如下所示:

清单6-4 中的代码和结果展现来自 DBCC 页的以身作则输出, 其 printopt 值为1。

页是 8KB 的轻重,即 8192
bytes,固定 96
bytes的高低给页头使用,接下去是现实性的多寡以槽的主意存款和储蓄。数据记录的最大尺寸是
8060 bytes(包罗 7
bytes的系统行开支卡塔尔国,由此一条记下中您抱有的最大字节数是 8053
bytes。下列的表创立语句会失败。

类型 页面类型名称 页面类型描述
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 语句之后的大容量操作所修改的区的信息

请小心, DBCC TRA高管N (3604) 提醒 SQL server 将结果回到给客商端。

1 CREATE TABLE Maxsize(
2 id         CHAR(8000) NOT NULL,
3 id1        CHAR(54) NOT NULL
4 )

  实际上SQLServer还满含部分未公开的页面类型,举个例子type 19,type
14之类。

风流洒脱经未有此 traceflag, 则不会为 DBCC 页命令归来输出。

图片 12

  本章大家重视介绍GAM页和SGAM页,其余页面类型会稍后介绍。

 

剩余的 36 bytes
(8192-96-8060卡塔尔国保留给槽数组(Slot
array卡塔尔恐怕别的转发行归来指针(forwarding
row back pointer卡塔尔国(每条10
bytes卡塔 尔(阿拉伯语:قطر‎。那就代表八个页不必然就会保留18(36/2)条记下。槽数组(Slot
array卡塔尔国依据你的记录数从下往上狠抓。假使记录长度小,页里就足以积存越多的记录,偏移表也会自下而上占用更加多的上空。 

  那么怎么着查看页面新闻吗,从SQLServer二零零四起便开端提供了叁个读取数据页结构的授命DBCC
Page。该命令为非文书档案化的吩咐,具体如下:

图片 13

参照作品:

http://www.sqlservercentral.com/blogs/practicalsqldba/2012/08/12/sql-server-understanding-the-data-page-structure/

  DBCC Page ({dbid|dbname},filenum,pagenum[,printopt])

正如所观望的, DBCC 页的输出分为四着重部分:
缓冲区、页题目、数据和偏移量表 (实际上是偏移量数组)。

  具体参数描述如下:

缓冲区局地显得有关给定页的缓冲区的音讯。

  dbid               满含页面包车型大巴数据库ID

此上下文中的缓冲区是管理页的内部存款和储蓄器结构,
本节中的消息仅在页处于内部存款和储蓄器中时才相关。

  dbname       包蕴页面包车型大巴数据库的称号

 

  filenum         包蕴页面包车型地铁文本编号

从 DBCC 页的 “输出” 页题目部分显得页上有着标题字段的数码。

  pagenum      文件内的页面

(表6-5 呈现了大多那个字段的意义。数据节包含每行的音讯。

  printopt            可选的出口选项;选拔此中贰个值:

选择具有 printopt 值1或3的 DBCC 页表示插槽地方,
即每行的6个表存款和储蓄257、页上的行的偏移量和行的尺寸。

                            0:暗中认可值,输出缓冲区的标题和页面标题

行数据分为三局地。

                          
1:输出缓冲区的标题、页面标题(分别出口每风姿罗曼蒂克行),以致行偏移量表

 

                          
2:输出缓冲区的标题、页面标题(全体出口页面),以至行偏移量表

左列提示展现数据所在行内的字节地方。

                           3:输出缓冲区的标题、页面题目(分别出口每风流罗曼蒂克行),以致行偏移量表;每风度翩翩行后跟分别列出的它的列值

当中有些含有存款和储蓄在页面上的实在多少, 每五列突显多少个十一进制数字。

  假设要想见见这个输出的结果,还必要安装DBCC TRACEON(3604)。

最左侧的列包涵数据的 ASCII 字符表示格局。 此列中独有字符数据是可读的,
就算也许会来得有个别其余数据。

  如前文所述,GAM页一定期存款在于该数据库的第4个页面,SGAM页则势必存在于该数据库的第多个页面;而每多少个数据库都会设有文件编号为1的数据库文件,所以大家进行以下命令就可以。

“偏移量表” 部分显得页面末尾的行偏移量数组的故事情节。

[html] view
plaincopy

 

  1. DBCC TRACEON(3604)  
  2. DBCC PAGE(TESTDB,1,2,1)  —查看GAM页信息  
  3. DBCC PAGE(TESTDB,1,3,1)  —查看SGAM页信息  
  4. DBCC PAGE(TESTDB,1,2,2)  —查看GAM页新闻和总体出口页面  
  5. DBCC PAGE(TESTDB,1,3,2)  —查看SGAM页消息和完好出口页面  
  6. DBCC PAGE(TESTDB,1,2,3)  —查看GAM页消息及相应列值  
  7. DBCC PAGE(TESTDB,1,3,3)  —查看SGAM页音信及相应列值  
  8. DBCC PAGE(TESTDB,1,2,1) WITH TABLERESULTS  —以表格情势查看SGAM页音讯及相应列值  
  9. DBCC PAGE(TESTDB,1,3,1) WITH TABLERESULTS  —以表格情势查看SGAM页消息及相应列值  

在 DBCC 页的出口中, 您可以见见此页蕴涵23行, 第大器晚成行 (由插槽0指令)
从偏移量 1585 (0x631) 最早。

 

实际上存款和储蓄在页面上的第意气风发行实际上是6行,
而行偏移量数组中的偏移量为96。printopt 值为1的 DBCC 页突显 “插槽编号”
顺序中的行, 即便能够从每一种插槽的偏移量中来看,
亦非在页面上其实存在行的次第。

  我们得以见到多少个总体的页面分为八个部分;BUFFE福睿斯、PAGE
HEADEEvoque、DATA和OFFSET TABLE。

借使使用 printopt 值为2的 DBCC 页, 则会看出页的持有8098个字节 (标头之后)
的转储, 按它们存款和储蓄在页面上的顺序排列。

  让我们先是从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 相对不变

  

  PAGE HEADER部分:

  PAGE HEADEWrangler部分呈现的是该页面上的保有报头字段的多寡

图片 14
 

  PAGE HEADE奇骏那意气风发部分剧情独有经过DBCC
PAGE(TESTDB,1,2,2)即全体出口页面手艺够表现;通过与地点表格的比较,大家勉强能辨别部分连锁存款和储蓄消息;当那有的缺点和失误官方文书档案的支撑,为了防止无谓的推测,所以不经常就不做浓郁切磋了。

图片 15
 

  DATA 部分

图片 16
 

   DATA部分平时分为若干插槽号(Slot),如若是数据页或索引页的话,能够领略为风流罗曼蒂克行记录,SQLServer通过文件号+页面号+插槽号用来唯意气风发标志表中的每一条记下。但在GAM页中大家得以把Slot
0领悟为GAM页的保存页,共计91个字节。

  从第1九十三个字节开首(页面总是从第0个字节开头的),到第199个字节,那多少个字节代表已分配的分区的景况。即0000C0。

  我们再来看一下DBCC PAGE(TESTDB,1,2,3)的实施结果。

图片 17
 

  上面显示从第1页到第168页已分配,而第176页到272页未分配,和DBCC
PAGE(TESTDB,1,2,2)显示的1九十几个页面犹如有个别万枘圆凿,实际上是不冲突的。如前文所述,GAM对未使用的分区标记为0,而对已分配的分区标志为1

  1个分区=64页,因为前1贰16个页面均已分配,所以前三个字节为00 00

  从第1二十柒个页面起到第1柒拾一个页面也均已分配,实际上为6个区为0也正是说三回九转6个bit为0,三个字节为8个bit,尾数bit为11,所以该字节为0000
0011,在这里须要反转一下相关二进制位;反转之后为1100 0000即为C0。

  最终让大家用Internals Viewer插件看一下GAM页的全貌吧。

图片 18
 

 

  SGAM页面

PAGE: (1:3)

BUFFER:
BUF @0x0358A7F4
bpage = 0x062AE000             bhash = 0x00000000              bpageno =
(1:3)
bdbid = 8                      breferences = 3                      
bUse1 = 14428
bstat = 0xc00009               blog = 0x21212159              bnext =
0x00000000
                                                               
PAGE HEADER:                                                   
Page @0x062AE000                                               
m_pageId = (1:3)               m_headerVersion = 1             m_type
= 9
m_typeFlagBits = 0x0           m_level = 0                    
m_flagBits = 0x200
m_objId (AllocUnitId.idObj)=99 m_indexId (AllocUnitId.idInd)=0
Metadata: AllocUnitId=6488064
Metadata: PartitionId = 0      Metadata: IndexId = 0           Metadata:
ObjectId = 99
m_prevPage = (0:0)             m_nextPage = (0:0)              pminlen
= 90
m_slotCnt = 2                  m_freeCnt = 6                  
m_freeData = 8182
m_reservedCnt = 0              m_lsn =
(18:435:5)              m_xactReserved = 0
m_xdesId = (0:0)               m_ghostRecCnt = 0              
m_tornBits = 177043542
Allocation Status              
GAM (1:2)=ALLOCATED            SGAM (1:3)=NOT
ALLOCATED          PFS(1:1)=0x44 ALLOCATED 100_PCT_FULL
DIFF (1:6) = CHANGED           ML (1:7) = NOT MIN_LOGGED         

DATA:
Slot 0, Offset 0x60, Length 94, DumpStyle BYTE
Record Type = PRIMARY_RECORD         Record Attributes
=                  
Memory Dump @0x4F32C060
00000000:   00005e00 00000000 00000000 00000000
?..^………….         
00000010:   00000000 00000000 00000000 00000000
?…………….         
00000020:   00000000 00000000 00000000 00000000
?…………….         
00000030:   00000000 00000000 00000000 00000000
?…………….         
00000040:   00000000 00000000 00000000 00000000
?…………….         
00000050:   00000000 00000000 00000000
0000??????…………..           

Slot 1, Offset 0xbe, Length 7992, DumpStyle BYTE
Record Type = PRIMARY_RECORD         Record Attributes
=                  
Memory Dump @0x4F32C0BE
00000000:   0000381f 20ee2000 00000000 00000000 ?..8. .
………         
00000010:   00000000 00000000 00000000 00000000 ?……………. 
00001F30:   00000000 00000000 ???????????????????……..           

 
   以下为DBCC
PAGE(TESTDB,1,3,3)获得的连锁音讯,有意思味的能够和20ee20做一下比照。

(1:0)        – (1:32)       = NOT
ALLOCATED                               
(1:40)       –              =    
ALLOCATED                               
(1:48)       – (1:64)       = NOT
ALLOCATED                               
(1:72)       – (1:88)       =    
ALLOCATED                               
(1:96)       –              = NOT
ALLOCATED                               
(1:104)      – (1:120)      =    
ALLOCATED                               
(1:128)      – (1:160)      = NOT
ALLOCATED                               
(1:168)      –              =    
ALLOCATED                               
(1:176)      – (1:272)      = NOT ALLOCATED

 
  最终让大家用Internals Viewer插件看一下SGAM页的全貌吧。

图片 19
 

  总计一下,关于GAM和SGAM页比较艰巨的地方:

  1、 关于GAM和SGAM页中的BUFFE瑞鹰音信基本不能清楚,也找不到相关资料。

  2、 PAGE HEADEHaval的某些音讯和Slot
0中的生龙活虎有个别音讯,也望眼欲穿找到相关资料。

  3、 SGAM页中的NOT
ALLOCATED实际上是统生龙活虎类型区恐怕已利用完的交集类型的区,而ALLOCATED实际上为包罗自由页面包车型大巴混合区。

  4、 GAM页中0代表已分配,1表示工商业自由贸易区;和日常的申明位的意思正好相反。

  5、
GAM和SGAM实际上只分红了277个页面,即三十几个区;展现出来的数目内容固然超级多,但背后的分区消息实际是荒诞不经的。

  6、
GAM和SGAM通过DBCC的printopt为3的属性突显出来的页面分配信息看似是断号的。

  7、 GAM和SGAM的区消息的字节是经过二级制反转拿到的。

  GAM和SGAM页的总的大小为81玖拾叁个字节;文件头为九十几个字节,slot
0为九十四个字节,slot
1的头顶的系统音讯为4个字节,尾部的种类音信为十个字节,所以有效积存应该为79八十七个字节,63904个区,5112贰十八个页;事实上圈套数据文件当先约4G的时候,我们将能在第511232页、
第511233页分别找到其对应的GAM、SGAM页面。

发表评论

电子邮件地址不会被公开。 必填项已用*标注