读书笔记,领会数据页结构

数据页是包蕴已增多到数据库表中的客户数据的构造。

作者们都很了解SQL Server用8KB
的页来积累数据,并且在SQL Server里磁盘 I/O 操作在页级实行。也便是说,SQL
Server
读取或写入全体数据页。页有例外的档期的顺序,像数据页,GAM,SGAM等。在这小说里,让大家联合来领会下数据页结构。

【IT168专稿】聊到GAM和SGAM,大家只好从数据库的页和区谈到。四个数据库由客户定义的空中组成,那个空中用来永远存款和储蓄客户对象,比如数据库管理消息、表和目录。这个空中被分配在三个或三个操作系统文件中。

《Microsoft Sql server 二零零六 Internals》索引目录:

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

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

  当大家创立贰个数据库的时候,举个例子以缺省的格局CREATE DATABASE
TESTDB,SQLServer自动帮我们创造好如下七个数据库文件。

《Microsoft Sql server 2010Internal》读书笔记–目录索引

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

数码页由3个部分构成。页头(标头),数据区(数据行和可用空间)及行偏移数组。

997755.com澳门葡京 1
 

 

与 SQL server 中的全体其余品种的页同样, 数据页的轻重固定为 8 KB
或8192字节。

997755.com澳门葡京 2

  这三个数据文件是属实的操作系统文件,在那之中三个是叫行数据文件,用来存款和储蓄数据库的种种对象,另外二个是日记文件,平素记录数据变动的经过。

 

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

在咱们斟酌在SQL
Server里,数据页内部结构具体是如何以前,大家来创制二个表并插入一些笔录。

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

上篇大家第一学习了元数据(metadata)的寄存及利用目录视图来询问这一个音讯,后天,大家承袭攻读数据页(Data
Pages)。

997755.com澳门葡京 3

 

  数据库被分成若干逻辑页面(各个页面8KB),况且在各类文件中,全部页面都被接连地从0到x编号,在这之中x是由文件的轻重决定的。大家可以通过点名贰个数据库ID、二个文本ID、一个页码来引用任何四个数据页。每种数据页则用来存款和储蓄表和目录,以及相关的数据库管理消息。

 数据页(Data
pages)是含有已经增多到数据库的表中的客户数据的布局。正如前方所看见的,数据页有三类,每类数据页以不一致的点子存款和储蓄数据。复习一下,分别是in-row
data pages、row-overflow data pages和LOB data
pages。与别的门类的page一样,data pages也是稳固的8K分寸或8192
bytes。它由三类组件组成:the page Header,data rows和the row offset
array,如下图所示:

 

 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

  大家沿着上边数据文件的门径能够找到该文件,观望一下新建的数据文件的轻重为:

997755.com澳门葡京 4

页标题

近期大家要寻觅SQL
Server给这一个表分配的页有怎么着,这么些就要动用非文书档案的一声令下DBCC
IND。
它的语法如下:

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

1、Page Header

 

DBCC IND
命令用于查询叁个仓库储存对象的里边存款和储蓄结构消息,该命令有4个参数,
前3个参数必得内定。语法如下:
DBCC IND ( { ‘dbname’ | dbid }, { ‘objname’ | objid },{ nonclustered
indid | 1 | 0 | -1 | -2 } [, partition_number] )
第3个参数是数据库名或数据库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
3000,第多个参数是可选的,该参数用于钦命一个分区号.假如不给定值大概给定0,
则呈现整个分区数据。
和DBCC PAGE不一致的是, SQL Server运营DBCC
IND无需敞开3604追踪标识.

  数据库实行空间管理的小不点儿单位为区(extents)。

正如上海图书馆所示,每一种data page (除去96 bytes,还应该有8096 bytes寄存data,row
overhead和row offset)。你能够使用上边包车型地铁DBCC Page命令来查阅。

如图6-4 所示, 页题目吞没每一个数据页的前99个字节
(为数据、行开销和行偏移保留80玖拾陆个字节)。表6-5
列出了自己斟酌页标题时突显的部分新闻。

小编们来奉行下列的通令:

  一个区由8个逻辑上海市总是的页面组成(64KB的长空)。为了能够更平价地分配空间,SQL
Server 二零一零不会为少量的数码向数据表分配整区的空中。SQL Server
二〇一〇有三种档期的顺序的区。

2、Data Rows for in-Rows

997755.com澳门葡京 5

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

  统一类型的区
那些区为单个对象具有,区中所有的8个数据页只可以被所属对象使用。

 Page Header的上面是row data,单个数据行最大能够贮存8060 bytes的in-row
data,那正是原先数据行无法超过8060限制的来头!有个别行也能够在独立的页面(pages)中贮存row-overflow
data和LOB数据,存款和储蓄在五个加以的page变量中的行数决意于表结构及数量被寄存的构造。八个具有一切恒定长度列的表每页能积存一样的行数。四个持有可变长度列的表在页中贮存区别的行数以适应数据的实在尺寸。保持行长度尽量短,允许越多的行以适应页面,减弱了I/O,改良了高速缓存命中率(cache-hit
ratio)。

 

SQL
Server会给大家如下的出口结果:
997755.com澳门葡京 6

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

为此,作为系统架构师或数据库Designer,实在有必不可缺掌握那些啊。邀月深有体会。呵呵。程序很烂,是后天的,但数据结构不创设,那是后天的,两个的杀伤力一样惊人!

行内数据的数据行

可以看出有2条记下,一条记下为页面类型(PageType)为10的页和一条记下为页面类型(PageType)为1的页。页面类型(PageType)10是IAM页,页面类型(PageType)1是数据页,它的页ID是79.

  SQL
Server为新的表或索引从混合类型的区中分配页面。当该表或索引拉长到8个页面时,以后全部的分配都应用统一类型的区。

3、Row Offset Array

 

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

  当一张表或一个索引要求更加多的上空时,SQL
Server须要找到能够用来分配的长空。即便该表或索引全体依旧有限8个页面,SQL
Server必需找到能够用来分配的插花类型区构成的空间。如果表或索引有8个页面或更加大,SQL
Server必须找到贰个随机的相会类型的区。

行偏移数组(row offset array) 是叁个2-byte
entries的块(block),各个项表达对应数据行在页开始的舞狮,每行(row)有叁个两字节的项。尽管那个字节不会和数量一起存款和储蓄在行中,它们能影响适应page的行数。行偏移数组表露了行在页上的逻辑顺序。举例,如若八个表有二个聚焦索引,SQL
Server按聚焦索引键的顺序寄放数据。那并不意味着数据是物理按聚焦索引键的逐个寄存,而是行偏移数组的Slot
0 指向聚焦索引键种类的首先行(row),Slot 1
指向第二行,等等。当大家要快快查看实际页的时候,这个行的大要地方或者在页的别的地点。

页题近来边是积存表实际数据行的区域。单个数据行的最大尺寸为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使用三种独特类其余页面来记录哪些区已经被分配出去了,哪些项目(混合类型或合併类型)的区可供使用:

 检查数据页(Exampling Data
Pages)

行还是可以够在单身的页上存款和储蓄行溢出和 LOB 数据。

当今大家来看看79号项目为1的数据页里贮存的数量,这一个将要用到DBCC
PAGE命令,它的语法如下:

  全局分配映射(Global Allocation Map,GAM)页面
这一个页面记录了怎么区已经被分配并用作何种用途。叁个GAM页面在它所掩瞒空间里针对每叁个区都有一个数码位。如若数量位为0,那么相应的区正在利用;借使该数量位为1,那么该区为工商业自由贸易区。贰个GAM页面除了页面底部和别的部分供给记入的支付大概有七千字节也许说64 000位空间可用,所以每一种GAM页面能够覆盖6陆仟个区,也便是大要4GB的数额。那意味一个文件的每4GB空间对应二个GAM页面。

 DBCC
page命令能够帮大家查询:MSDN文书档案中中尚无提供此命令读书笔记,领会数据页结构。,微软真的很非常啊。语法为:

在给定页上囤积的行数依照表结谈判存款和储蓄的数额而生成。

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页面覆盖了大致6陆仟个区,也正是大约4GB的数码。二个SGAM页面在它所覆盖空间里针对每一个区都有三个数码位。假设数据位为1,那么相应的被选拔的区为混合类型,何况该区有一对随意页面;要是数额位为0,那么相应的区不是贰个掺杂类型的区,只怕纵然是一个错落类型的区,不过全体的页面都已经被应用了。

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

抱有全数固定长度列的表始终能够储存每页同样的行数;

我们来实行下列的授命:

  表4-2体现了依赖每三个区当下的利用状态,在GAM和SGAM中该区所对应的比特位形式。

内部,最终贰个参数能够是0,1,2,3,默感觉0,风乐趣的情侣能够相比较下那几个参数的区别。大家作个示例:

可变长度行可以依据输入数据的实在尺寸, 存储尽可能多的行。

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

DBCC traceON(3604)
go
–查询testdb数据库的第四个公文的第157页的数据页
DBCC PAGE (testdb,1,157,1);
997755.com澳门葡京 ,GO

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

SQL
Server会给大家包蕴4个部分的出口。第1片段是BUFFELacrosse,里面是一对内部存款和储蓄器分配消息,对此大家十分少兴趣。下一部分是原则性96
bytes大小的页头(page header),页头(page
header)会周围如下显示:

  即使SQL
Server供给找到叁个新的一心未有选拔的区,那么它能够使用别的贰个在GAM页面中对应的比特位值为1的区。即使SQL
Server要求找到三个具备可用空间(有一个或多少个随机页面)的混杂类型的区,那么它可以寻找三个相应的GAM中的值为0、SGAM中的值为1的区。假若不设有有可用空间的交集类型的区,SQL
Server会使用GAM页面来查找三个全新的区并将其分配为混合类型的区,然后使用该区中的一页。倘若根本未曾工商业自由贸易区,那么那么些文件已经满了。

查询结果如下:

 

997755.com澳门葡京 7

第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页

997755.com澳门葡京 8

行偏移量数组

页头相关字段的意思:

  SQL
Server能够连忙地锁定两个文本中的GAM页面,因为它连接位于任何数据库文件的第三页上(页码为2)。SGAM页面是在第四页上(页码为3)。下三个GAM页面出现在首先个GAM页面(页码为2)今后的每511
2二十五个页面中,并且下二个SGAM页面现身在第二个SGAM页面(页码为3)未来的每511
228个页面中。每多个数据库文件的页码为0的页面是文本头页面,况兼各个文件唯有一页。页码0是头文件页,页码1是页面自由空间页(Page
Free Space,PFS)。

997755.com澳门葡京 9

 

  • 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
    = 0x七千          页面标记
  • 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的每七个数据库中的前八页顺序都以固定的。

其它,还会有更详尽的第X到第X行的数码显示。更加多新闻,请查看:

行偏移量数组是2字节项的块, 每种条目款项表示相应数据行发轫的页面上的偏移量。

再来看下页面相关分配景况:

  除了第9页为数据库的BOOT页以外,从第8页到第173页为SQLServer二〇一〇内部系统表的连带存款和储蓄音讯,然后从第174页到第279页为未分配页面。因为第一页从0开首,所以刚刚280页,即和大家看看的数据库数据文件的轻重完全相等。

 http://support.microsoft.com/?scid=kb%3Ben-us%3B83065&x=15&y=13http://blogs.msdn.com/sqlserverstorageengine/archive/2006/12/13/More-undocumented-fun\_3A00\_-DBCC-IND\_2C00\_-DBCC-PAGE\_2C00\_-and-off\_2D00\_row-columns.aspx

每行在这一个数组中都有八个2字节的条约 (正如后面所争持的,
当您读书每行所需的拾二个开荒字节时)。

 997755.com澳门葡京 10

第8页

 http://support.microsoft.com/?scid=kb%3Ben-us%3B83065&x=8&y=12

虽说那个字节没有存款和储蓄在数码行中, 但它们确实会影响相符页面的行数。

  • 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页

查询结果分为四局地:BUFFER、PAGE HEADER、DATA、和OFFSET
TABLE
(即真实的offset array) ,

 

接下去便是用来贮存实际多少的槽(slot),每条记下存放一个槽(slot)里。0号槽在页里具备第1条数据,1号槽具有第2条数据,就这样类推。通过上面的图样,你能够观望我们记录大小是224
bytes,217 bytes(50+50+100+5+4+8) 的定长和7 bytes
的系统行成本。

第8页

 
注意,要想获得近似上海教室的查询的精心新闻,总得选用展开TRACEON开关,语法为:

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

997755.com澳门葡京 11

第N页

DBCC traceON(3604)
GO

举例说, 如若表具有聚焦索引, SQL server 将按聚集索引键的顺序存款和储蓄那一个行。

页的最终一局地是行偏移数组表,大家得以用参数为1的DBCC
PAGE命令来,在输出新闻的最底层得到。

第173页

有关DBCC TRACOON (Transact-SQL)的越多用法,请参见MSDN

这并不意味行按聚焦索引键的一一物理地囤积在页面上。

施行如下的指令:

第279页

举个例子说您想获悉系统硬件的连带新闻,能够通过DBCC
traceON(3205)展开追踪开关。
 

反而, 偏移量数组中的插槽0援用集中索引键顺序中的第一行, 插槽1援引第二行,
就这样类推。

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

m_type=1

 数据行的布局(the structure of data rows)
二个表的通用结构如下图所示:

正如您在检查实际上页面时所见到的那样,
那几个行的情理地方能够放在页面包车型地铁别样地点。

SQL
Server在输出新闻的最底层,给大家如下的新闻:

m_type=13

 997755.com澳门葡京 12

 

997755.com澳门葡京 13

m_type in (1,2,10)

 在那之中:状态位A富含一个关于行的位图音信。这么些bits有如下含义:

查看数据页

本条行偏移表,应该从下往上读。每条槽条约是一个2
bytes长的指针指向页里槽偏移量。这里大家插入了2条记下,所以表里有2个槽条目。第1条记下指向第96
bytes,刚万幸页头后。那些行偏移表能够扶持大家处理页面包车型地铁记录。在页里的行偏移表里,每条记下要求2
bytes的尺寸来囤积。于此类似,在堆表上树立的非集中索引,每一种非聚焦索引行里都富含三个物理指针映射回堆表里的行记录。这么些物理指针是[文件号:页号:槽号](file:page:solt)的组织,因而在读取页的时候,能够找到堆表里的对应行,再通过行偏移表里槽号里的偏移量,就足以在页里读取到对应的行记录。假若大家要修改页中间的记录,大家并不一定供给结合全体页,大家只要修改偏移表里偏移量就能够。

N/A

      Bit 0 Versioning information; in SQL Server 2008, it’s always 0.
      Bits 1 through 3 Taken as a 3-bit value, 0 indicates a primary record, 1 indicates a forwarded record, 2 indicates a forwarded stub, 3 indicates an index record, 4 indicates a blob fragment, 5 indicates a ghost index record, and 6 indicates a ghost data record.
      Bit 4 Indicates that a NULL bitmap exists; in SQL Server 2008, a NULL bitmap is always present, even if no NULLs are allowed in any column.
      Bit 5 Indicates that variable-length columns exist in the row.
      Bits 6 Indicates that the row contains versionings information.
      Bits 7 Not used in SQL Server 2008.

 

997755.com澳门葡京 14

Data页

状态位B字段中只使用一位,表示该记录是一条备份转发记录。

能够采取 DBCC 页命令查看数据页的剧情, 

在页头我们看来眼下页面还应该有7644
bytes能够用,大家一块来表达下。

Boot页

下表展现了表数据行的存款和储蓄消息:

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

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

要害为当中系统表相关新闻

Information

Mnemonic

Size

Status Bits A

TagA

1 byte

Status Bits B (not used in SQL Server 2008)

TagB

1 byte

Fixed-length size

Fsize

2 bytes

Fixed-length data

Fdata

Fsize –4

Number of columns

Ncol

2 bytes

NULL bitmap(1 byte for each column in table; 1 indicates that the corresponding column is NULL)

Nullbits

Ceiling (Ncol / 8)

Number of variable-length columns

VarCount

2 bytes

Variable column offset array

VarOffset

2 * VarCount

Variable-length data

VarData

VarOff[VarCount]
— (fsize + 4 + Ceiling
(Ncol / 8) + 2 * VarCount)

独有系统管理员技艺使用 DBCC 页。

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

未分配

 

唯独, 由于平日无需查阅数据页的源委, 因而在 SQL server 文书档案中找不到关于
DBCC 页的新闻。

         96 = 页头大小 96
bytes       

  以下截图是通过SQLServer二〇〇八的Internals
Viewer插件看见的一体化页面结构,该插件是从

风趣的是,当你创设多少个表的时候,固定长度的列是先被积累的,举例那样三个言语

只是, 纵然您想利用它, 下边是语法:

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

  备注:TESTDB为新创造的空数据库,未有另外客户自定义对象,直到有建表脚本结束;

CREATE TABLE dbo.Demotable2010( 
               int PKID,not null
               emp_fname  varchar(10)   NOT NULL, 
               phone      char(12)      NOT NULL, 
               job_level  smallint      NOT NULL 
);

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

     7 * 2 =
每条记下的体系行费用 * 记录数

997755.com澳门葡京 15
 

率先存款和储蓄的是pkid,再是phone,job_level,最终才是 emp_fname,因为它是可变长度的。

 

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

997755.com澳门葡京 16

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

 

剩余的 36 bytes
(8192-96-8060)保留给槽数组(Slot
array)或许别的转发行归来指针(forwarding
row back pointer)(每条10
bytes)。那就表示三个页不必然就会保存18(36/2)条记下。槽数组(Slot
array)依照你的记录数从下往上升高。假使记录长度小,页里就足以积累越来越多的笔录,偏移表也会自下而上占用越来越多的空间。 

  那么如何查看页面消息呢,从SQLServer两千起便开头提供了二个读取数据页结构的指令DBCC
Page。该命令为非文档化的通令,具体如下:

997755.com澳门葡京 17

参照文章:

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 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) 开头。

 

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

  大家得以见见多个一体化的页面分为三个部分;BUFFE库罗德、PAGE
HEADERubicon、DATA和OFFSET TABLE。

纵然利用 printopt 值为2的 DBCC 页, 则拜望到页的有着8097个字节 (标头之后)
的转储, 按它们存储在页面上的顺序排列。

  让我们率先从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奥德赛部分显示的是该页面上的全部报头字段的数码

997755.com澳门葡京 18
 

  PAGE HEADE奥迪Q7这一部分情节独有因而DBCC
PAGE(TESTDB,1,2,2)即全部出口页面才可以呈现;通过与地点表格的自己检查自纠,大家勉强能辨别部分连锁存款和储蓄消息;当这一部分缺点和失误官方文书档案的支撑,为了幸免无谓的臆想,所以一时就不做深远研究了。

997755.com澳门葡京 19
 

  DATA 部分

997755.com澳门葡京 20
 

   DATA部分日常分为若干插槽号(Slot),假若是数据页或索引页的话,能够明白为一行记录,SQLServer通过文件号+页面号+插槽号用来独一标志表中的每一条记下。但在GAM页中大家得以把Slot
0掌握为GAM页的保留页,共计玖拾叁个字节。

  从第195个字节早先(页面总是从第0个字节开端的),到第1玖拾陆个字节,那四个字节代表已分配的分区的情景。即0000C0。

  大家再来看一下DBCC PAGE(TESTDB,1,2,3)的执行结果。

997755.com澳门葡京 21
 

  下边突显从第1页到第168页已分配,而第176页到272页未分配,和DBCC
PAGE(TESTDB,1,2,2)呈现的1玖拾一个页面就像是不怎么格不相入,实际上是不争持的。如前文所述,GAM对未利用的分区标志为0,而对已分配的分区标志为1

  1个分区=64页,因为前135个页面均已分配,所此前七个字节为00 00

  从第124个页面起到第1七11个页面也均已分配,实际上为6个区为0也正是说接二连三6个bit为0,几个字节为8个bit,最终四个bit为11,所以该字节为0000
0011,在此需求反转一下有关二进制位;反转之后为1100 0000即为C0。

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

997755.com澳门葡京 22
 

 

  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页的全貌吧。

997755.com澳门葡京 23
 

  总计一下,关于GAM和SGAM页相比辛勤的地点:

  1、 关于GAM和SGAM页中的BUFFEEnclave音讯基本不能够知晓,也找不到相关资料。

  2、 PAGE HEADEEscort的一部分音讯和Slot
0中的一有的消息,也心有余而力不足找到有关材质。

  3、 SGAM页中的NOT
ALLOCATED实际上是联合类型区也许已采取完的掺和类型的区,而ALLOCATED实际上为含有自由页面包车型客车混合区。

  4、 GAM页中0代表已分配,1象征自由区;和经常的注明位的意义刚好相反。

  5、
GAM和SGAM实际上只分红了2八十个页面,即三17个区;展现出来的数量内容即使相当多,但背后的分区信息实际是官样文章的。

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

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

  GAM和SGAM页的总的大小为81九十几个字节;文件头为玖拾玖个字节,slot
0为玖拾伍个字节,slot
1的头顶的系统新闻为4个字节,尾巴部分的种类消息为11个字节,所以有效累积应该为79捌17个字节,63904个区,5112二拾伍个页;事实受愚数据文件当先约4G的时候,大家将能在第511232页、
第511233页分别找到其相应的GAM、SGAM页面。

相关文章

发表评论

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

*
*
Website