数据页是满含已加多到数据库表中的顾客数据的构造。

我们都很明亮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个部分组成。页头(标头),数据区(数据行和可用空间)及行偏移数组。

home88一必发 1
 

与 SQL server 中的全体别的类其余页相近, 数据页的抑扬顿挫固定为 8 KB
或8192字节。

home88一必发 2

  那三个数据文件是如数家珍的操作系统文件,当中三个是叫行数据文件,用来囤积数据库的各样对象,其余三个是日记文件,平昔记录数据变动的进度。

它们由三第黄金时代组件组成: 页面页眉、数据行和行偏移量数组, 如图6-4 所示。

在大家探究在SQL
Server里,数据页内部布局具体是何许以前,我们来创建一个表并插入一些记下。

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

home88一必发 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
2001,第八个参数是可选的,该参数用于钦点一个分区号.如若不给定值恐怕给定0,
则突显任何分区数据。
和DBCC PAGE分化的是, SQL Server运营DBCC
IND不供给张开3604追踪标记.

  数据库进行空中管理的细卡片机位为区(extents卡塔尔(英语:State of Qatar)。

如图6-4 所示, 页标题攻陷各类数据页的前九十九个字节
(为多少、行开支和行偏移保留80玖拾陆个字节卡塔尔国。表6-5
列出了反省页标题时呈现的局部音信。

我们来试行下列的通令:

  叁个区由8个逻辑上一连的页面组成(64KB的半空中卡塔尔。为了能够更管用地分配空间,SQL
Server 二零零六不会为一些些的多少向数据表分配整区的上空。SQL Server
贰零零玖有二种等级次序的区。

home88一必发 4

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

  统黄金年代类型的区
那几个区为单个对象具有,区中全体的8个数据页只好被所属对象使用。

 

SQL
Server会给我们如下的输出结果:
home88一必发 5

  混合类型的区 这么些区能为最多8个对象分享。

行内数据的数据行

能够见到有2条记下,一条记下为页面类型(PageType)为10的页和一条记下为页面类型(PageType)为1的页。页面类型(PageType)10是IAM页,页面类型(PageType)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)页面
    这么些页面记录了怎么样区已经被分配并用作何种用处。

  • 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卡塔尔(英语:State of Qatar)页面
这几个页面记录了什么样区已经被分配并用作何种用项。贰个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:输出缓冲区的标题、页面标题(分别出口每生机勃勃行卡塔尔(英语:State of Qatar),以至行偏移量表
  2:输出缓冲区的标题、页面标题(全部出口页面卡塔尔(英语:State of Qatar),以至行偏移量表
  3:输出缓冲区的标题、页面标题(分别出口每豆蔻年华行卡塔尔(قطر‎,以至行偏移量表;每风流罗曼蒂克行
  后跟分别列出的它的列值
  要想看看那些输出的结果,还索要设置DBCC TRA总裁N(3604卡塔尔(英语:State of Qatar)。

  分享全局分配映射(Shared Global Allocation Map,SGAM卡塔尔(英语:State of Qatar)页面
这几个页面记录了哪些区当前被充任混合类型的区,何况这么些区需满含最少一个未使用的页面。就好像一个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片段是BUFFEWrangler,里面是有的内部存款和储蓄器分配音信,对此我们非常少兴趣。下朝气蓬勃部分是定位96
bytes大小的页头(page header),页头(page
header)会相似如下展现:

  假设SQL
Server要求找到叁个新的一丝一毫未有利用的区,那么它能够采取任何三个在GAM页面中对应的比特位值为1的区。假若SQL
Server供给找到四个负有可用空间(有一个或多个随机页面卡塔尔(英语:State of Qatar)的交集类型的区,那么它能够搜寻多个相应的GAM中的值为0、SGAM中的值为1的区。若是不设有有可用空间的错落有致类型的区,SQL
Server会使用GAM页面来寻找一个簇新的区并将其分配为混合类型的区,然后利用该区中的后生可畏页。假诺根本未有工商业自由贸易区,那么那么些文件已经满了。

 

home88一必发 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贰十七个页面中。每八个数据库文件的页码为0的页面是文本头页面,并且每一种文件只有意气风发页。页码0是头文件页,页码1是页面自由空间页(Page
Free Space,PFS卡塔尔(英语:State of Qatar)。

 

  • 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树)中的级数
  • 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                      
      页的校验位照旧被由数据库页面爱护格局决定分页珍视位代表

  在SQLServer二零一零的每一个数据库中的前八页顺序都以一定的。

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

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

  除了第9页为数据库的BOOT页以外,从第8页到第173页为SQLServer2009内部系统表的相干存款和储蓄信息,然后从第174页到第279页为未分配页面。因为第生龙活虎页从0伊始,所以刚刚280页,即和大家看看的数据库数据文件的轻重完全相等。

每行在这里个数组中都有二个2字节的条目 (正如前边所商议的,
当您读书每行所需的11个开拓字节时卡塔尔(英语:State of Qatar)。

 home88一必发 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页

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

home88一必发 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

 

home88一必发 9

m_type in (1,2,10)

翻看数据页

其风华正茂行偏移表,应该从下往上读。每条槽条款是四个2
bytes长的指针指向页里槽偏移量。这里大家插入了2条记下,所以表里有2个槽条款。第1条记下指向第96
bytes,恰好在页头后。那么些行偏移表能够协理大家管理页面包车型客车记录。在页里的行偏移表里,每条记下须要2
bytes的尺寸来积存。于此形似,在堆表上树立的非集中索引,每一种非聚集索引行里都含有四个物理指针映射回堆表里的行记录。那一个物理指针是[文件号:页号:槽号](file:page:solt)的布局,因此在读取页的时候,能够找到堆表里的对应行,再通过行偏移表里槽号里的偏移量,就足以在页里读取到对应的行记录。若是我们要改正页中间的笔录,大家并不一定须要组合全体页,大家假诺校订偏移表里偏移量就可以。

N/A

 

home88一必发 10

Data页

能够动用 DBCC 页命令查看数据页的剧情, 

在页头咱们看来眼下页面还应该有7644
bytes能够用,我们一起来申明下。

Boot页

home88一必发,那允许你查看数据库中别的给定页的页标题、数据行和行偏移表。

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

尤为重要为内部系统表相关音信

唯有系统管理员能力利用 DBCC 页。

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

未分配

只是, 由于平常无需查阅数据页的源委, 由此在 SQL server 文书档案中找不到关于
DBCC 页的新闻。

         96 = 页头大小 96
bytes       

  以下截图是经过SQLServer贰零零玖的Internals
Viewer插件看见的总体页面结构,该插件是从

不过, 如果您想利用它, 上面是语法:

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

  备注:TESTDB为新创制的空数据库,未有其他客户自定义对象,直到有建表脚本停止;

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

     7 * 2 =
每条记下的体系行成本 * 记录数

home88一必发 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 页命令归来输出。

home88一必发 12

  本章大家根本介绍GAM页和SGAM页,别的页面类型会稍后介绍。

 

剩余的 36 bytes
(8192-96-8060)保留给槽数组(Slot
array)只怕别的转发行回到指针(forwarding
row back pointer)(每条10
bytes)。那就表示八个页不自然就会保留18(36/2卡塔尔国条记下。槽数组(Slot
array)根据你的记录数从下往上抓实。假如记录长度小,页里就可以储存越来越多的笔录,偏移表也会自下而上占用更加多的上空。 

  那么什么样查看页面新闻呢,从SQLServer二零零三起便起初提供了一个读取数据页布局的下令DBCC
Page。该命令为非文书档案化的命令,具体如下:

home88一必发 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 展现了超越55%这一个字段的含义。数据节包括每行的音讯。

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

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

                            0:默许值,输出缓冲区的标题和页面标题

行数据分为三片段。

                          
1:输出缓冲区的标题、页面标题(分别出口每生龙活虎行卡塔尔国,以致行偏移量表

 

                          
2:输出缓冲区的标题、页面标题(全体出口页面卡塔尔(قطر‎,以致行偏移量表

左列指示突显数据所在行内的字节地点。

                           3:输出缓冲区的标题、页面标题(分别出口每生机勃勃行卡塔尔国,以至行偏移量表;每蓬蓬勃勃行后跟分别列出的它的列值

中级有个别含有存款和储蓄在页面上的实际数目, 每五列显示四个十四进制数字。

  假若要想见到这个输出的结果,还亟需安装DBCC TRA老总N(3604卡塔尔。

最左侧的列包括数据的 ASCII 字符表示方式。 此列中唯有字符数据是可读的,
固然可能会显得有些别的数据。

  如前文所述,GAM页一定期存款在于该数据库的第贰个页面,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卡塔尔(英语:State of Qatar) 初始。

 

实质上存储在页面上的率先行实际上是6行,
而行偏移量数组中的偏移量为96。printopt 值为1的 DBCC 页展现 “插槽编号”
顺序中的行, 就算能够从每一个插槽的偏移量中看看,
亦非在页面上其实存在行的相继。

  大家得以看见二个完全的页面分为四个部分;BUFFETucson、PAGE
HEADE奥德赛、DATA和OFFSET TABLE。

假定接收 printopt 值为2的 DBCC 页, 则拜谒到页的具有80一百个字节 (标头之后卡塔尔的转储, 按它们存储在页面上的顺序排列。

  让大家先是从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 HEADE昂科威部分展现的是该页面上的全数报头字段的数量

home88一必发 14
 

  PAGE HEADE福特Explorer那风流倜傥部分剧情独有经过DBCC
PAGE(TESTDB,1,2,2卡塔尔国即全部出口页面本领够彰显;通过与地点表格的自己检查自纠,大家勉强能识别部分生死相依存款和储蓄消息;当那部分缺点和失误官方文书档案的支撑,为了防止无谓的估算,所以一时就不做浓重钻探了。

home88一必发 15
 

  DATA 部分

home88一必发 16
 

   DATA部分常常分为若干插槽号(Slot卡塔尔(قطر‎,要是是数据页或索引页的话,可以知晓为生机勃勃行记录,SQLServer通过文件号+页面号+插槽号用来唯生龙活虎标志表中的每一条记下。但在GAM页中我们得以把Slot
0精通为GAM页的保存页,共计九十二个字节。

  从第1玖拾肆个字节起始(页面总是从第0个字节初步的卡塔尔,到第199个字节,那多个字节代表已分配的分区的事态。即0000C0。

  大家再来看一下DBCC PAGE(TESTDB,1,2,3卡塔尔(英语:State of Qatar)的实施结果。

home88一必发 17
 

  下边呈现从第1页到第168页已分配,而第176页到272页未分配,和DBCC
PAGE(TESTDB,1,2,2卡塔尔(قطر‎彰显的1九十一个页面就好像有一点凿枘不入,实际上是不冲突的。如前文所述,GAM对未利用的分区标记为0,而对已分配的分区标志为1

  1个分区=64页,因为前1二十七个页面均已分配,所早前多少个字节为00 00

  从第1叁十二个页面起到第1柒16个页面也均已分配,实际上为6个区为0也等于说三番五次6个bit为0,三个字节为8个bit,最终两个bit为11,所以该字节为0000
0011,在这需求反转一下连锁二进制位;反转之后为1100 0000即为C0。

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

home88一必发 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页的全貌吧。

home88一必发 19
 

  总计一下,关于GAM和SGAM页相比较费劲的地点:

  1、 关于GAM和SGAM页中的BUFFE宝马7系音信基本不可能驾驭,也找不到相关资料。

  2、 PAGE HEADEENVISION的黄金时代对新闻和Slot
0中的生龙活虎有个别音信,也无计可施找到相关资料。

  3、 SGAM页中的NOT
ALLOCATED实际上是统风华正茂类型区恐怕已选拔完的混合类型的区,而ALLOCATED实际上为带有自由页面包车型客车混合区。

  4、 GAM页中0代表已分配,1代表工商业自由贸易区;和平日的标识位的意义赶巧相反。

  5、
GAM和SGAM实际上只分红了276个页面,即叁拾柒个区;突显出来的数量内容纵然相当多,但背后的分区新闻实际是官样文章的。

  6、
GAM和SGAM通过DBCC的printopt为3的天性展现出来的页面分配新闻看似是断号的。

  7、 GAM和SGAM的区信息的字节是透过二级制反转获得的。

  GAM和SGAM页的总的大小为81九十四个字节;文件头为98个字节,slot
0为玖拾伍个字节,slot
1的头顶的系统消息为4个字节,尾巴部分的体系音讯为拾贰个字节,所以有效积存应该为79捌21个字节,63904个区,5112三拾柒个页;事实上圈套数据文件超越约4G的时候,我们将能在第511232页、
第511233页分别找到其对应的GAM、SGAM页面。

相关文章