图片 8

Server内幕之数据页,理解数据页结构

数据页是含有已增添到数据库表中的顾客数量的布局。

大家都很清楚SQL Server用8KB
的页来囤积数据,何况在SQL Server里磁盘 I/O 操作在页级试行。也正是说,SQL
Server
读取或写入全部数据页。页有两样的花色,像数据页,GAM,SGAM等。在此文章里,让大家一同来明白下数据页结构。

如前所述, 数据页有二种, 每一个都是不相同的格式存款和储蓄数据。

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

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

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

与 SQL server 中的全数别的品类的页相似, 数据页的高低固定为 8 KB
或8192字节。

图片 1

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

在大家谈谈在SQL
Server里,数据页内部结构具体是什么从前,我们来创设三个表并插入一些笔录。

图片 2

 

 

 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。
它的语法如下:

 

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
2003,第多个参数是可选的,该参数用于钦点多少个分区号.要是不给定值可能给定0,
则显示任何分区数据。
和DBCC PAGE分裂的是, SQL Server运营DBCC
IND没有必要展开3604追踪标记.

如图6-4 所示, 页标题攻克各类数据页的前九十六个字节
(为数量、行开销和行偏移保留80九十八个字节)。表6-5
列出了检讨页标题时呈现的片段新闻。

咱俩来执行下列的指令:

图片 3

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

 

SQL
Server会给大家如下的输出结果:
图片 4

行内数据的数据行

能够见到有2条记下,一条记下为页面类型(PageType)为10的页和一条记下为页面类型(PageType)为1的页。页面类型(PageType)10是IAM页,页面类型(PageType)1是数据页,它的页ID是79.

 

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

页标题前边是积存表实际数据行的区域。单个数据行的最大尺寸为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 语句之后的大体量操作所修正的区的新闻

行还能在单独的页上存款和储蓄行溢出和 LOB 数据。

未来大家来拜谒79号项目为1的多寡页里寄放的数据,那么些将要用到DBCC
PAGE命令,它的语法如下:

在给定页上囤积的行数根据表结商谈储存的多少而生成。

dbcc page
命令读取数据页结构的下令DBCC Page。
该命令为非文书档案化的指令,具体如下:
  DBCC Page ({dbid|dbname},filenum,pagenum[,printopt])
  具体参数描述如下:
  dbid 包括页面包车型客车数据库ID
  dbname 包涵页面包车型地铁数据库的名号
  filenum 包涵页面包车型客车文件编号
  pagenum 文件内的页面
  printopt 可选的出口选项;采用个中叁个值:
  0:暗中同意值,输出缓冲区的标题和页面标题
  1:输出缓冲区的标题、页面标题(分别出口每生龙活虎行),以致行偏移量表
  2:输出缓冲区的标题、页面标题(全体出口页面),以至行偏移量表
  3:输出缓冲区的标题、页面标题(分别出口每大器晚成行),以至行偏移量表;每黄金时代行
  后跟分别列出的它的列值
  要想见见这个输出的结果,还必要安装DBCC TRACEON(3604)。

具备全部固定长度列的表始终能够积累每页相仿的行数;

小编们来进行下列的一声令下:

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

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

保障行长越来越短能够使越多行相符页面, 从而减弱 i/o
并追加所需数据在缓存中的可能。

SQL
Server会给大家满含4个部分的出口。第一盘部是BUFFEEscort,里面是有的内部存储器分配新闻,对此大家相当的少兴趣。下生龙活虎部分是稳定96
bytes大小的页头(page header),页头(page
header)会贴近如下展现:

 

图片 5

行偏移量数组

页头相关字段的意义:

 

  • 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                      
      页的校验位依旧被由数据库页面爱抚格局决定分页保养位代表

行偏移量数组是2字节项的块, 种种条约表示相应数据行初阶的页面上的偏移量。

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

每行在这里个数组中都有一个2字节的条款 (正如前边所批评的,
当您读书每行所需的十个开采字节时)。

 图片 6

虽说这么些字节未有存储在多少行中, 但它们确实会影响切合页面包车型地铁行数。

  • 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   

 

接下去正是用来贮存实际数目标槽(slot),每条记下贮存三个槽(slot)里。0号槽在页里具备第1条数据,1号槽具备第2条数据,由此及彼。通过下边的图样,你能够看见大家记录大小是224
bytes,217 bytes(50+50+100+5+4+8) 的定长和7 bytes
的体系行费用。

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

图片 7

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

页的末段生机勃勃部分是行偏移数组表,大家得以用参数为1的DBCC
PAGE命令来,在输出音讯的底部获得。

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

施行如下的通令:

相反, 偏移量数组中的插槽0引用聚焦索引键顺序中的第大器晚成行, 插槽1援引第二行,
就这样类推。

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

正如您在检查其实页面时所见到的那么,
这一个行的大意地点能够投身页面包车型客车别之处。

SQL
Server在出口音信的底层,给咱们如下的音讯:

 

图片 8

发表评论

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