Server内幕之数据页,理解数据页结构【永利皇宫登录网址】

数据页是带有已加多到数据库表中的用户数据的构造。

小编们都很了解SQL Server用8KB
的页来积存数据,并且在SQL Server里磁盘 I/O 操作在页级推行。相当于说,SQL
Server
读取或写入全部数据页。页有例外的等级次序,像数据页,GAM,SGAM等。在那小说里,让我们一齐来明白下数据页结构。

如前所述, 数据页有两种, 各样都以区别的格式存款和储蓄数据。

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

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

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

与 SQL server 中的全数其余品种的页同样, 数据页的分寸固定为 捌 KB
或81玖二字节。

永利皇宫登录网址 1

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

在大家商量在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
命令用于查询多少个存储对象的个中存款和储蓄结构音讯,该命令有5个参数,
前1个参数必须内定。语法如下:
DBCC IND ( { ‘dbname’ | dbid }, { ‘objname’ | objid },{ nonclustered
indid | 1 | 0 | -1 | -2 } [, partition_number] )
首先个参数是数据库名或数据库ID。
其次个参数是数据库中的对象名或对象ID,对象能够是表可能索引视图。
其四个参数是多少个非聚焦索引ID或然 1, 0, 一, or 2. 值的意义:
 0: 只展现对象的in-row data页和 in-row IAM 页。
 一: 显示对象的1切页, 包罗IAM 页, in-row数据页, LOB 数据页row-overflow
数据页 . 如果请求的靶子涵盖聚焦所以则索引页也包括。
 -一: 展现任何IAM页,数据页, 索引页 也席卷 LOB 和row-overflow 数据页。
 -二: 呈现任何IAM页。
 Nonclustered index ID:展现索引的万事 IAM页, data页和索引页,包括LOB和
row-overflow数据页。
为了协作sql server
三千,第四个参数是可选的,该参数用于钦点贰个分区号.假诺不给定值可能给定0,
则突显任何分区数据。
和DBCC PAGE分化的是, SQL Server运营DBCC
IND不供给开启360四追踪标识.

如图陆-四 所示, 页标题侵吞各类数据页的前九伍个字节
(为多少、行开销和行偏移保留80九五个字节)。表六-5列出了检查页标题时呈现的有个别消息。

大家来实行下列的吩咐:

永利皇宫登录网址 3

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

 

SQL
Server会给大家如下的出口结果:
永利皇宫登录网址 4

行内数据的数据行

能够见见有贰条记下,一条记下为页面类型(PageType)为10的页和一条记下为页面类型(PageType)为1的页。页面类型(PageType)10是IAM页,页面类型(PageType)一是数据页,它的页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)页面
    那个页面记录了哪些区当前被当做混合类型的区,并且那么些区需包涵至少3个未利用的页面。

  • 10
    IAM page
     有关每一个分配单元中表或索引所选取的区的音信

  • 11 PFS
    page

     有关页分配和页的可用空间的信息

  • 13 boot page
    记录了关于数据库的音讯,仅存于每一个数据库的第九页

  • 15 file header
    page 
    记录了有关数据库文件的音讯,存于各个数据库文件的第0页

  • 16 DCM
    page

    记录自从上次全备以来的数目变动的页面,以备差别备份

  • 17 BCM
    page
     有关每种分配单元中自最终一条
    BACKUP LOG 语句之后的大体积操作所修改的区的音信

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

现在大家来看看7玖号项目为1的数据页里存放的数据,那么些将要用到DBCC
PAGE命令,它的语法如下:

在给定页上囤积的行数依据表结商谈累积的多少而调换。

dbcc page
命令读取数据页结构的一声令下DBCC Page。
该命令为非文书档案化的指令,具体如下:
  DBCC Page ({dbid|dbname},filenum,pagenum[,printopt])
  具体参数描述如下:
  dbid 包罗页面包车型客车数据库ID
  dbname 包括页面的数据库的名号
  filenum 包罗页面包车型大巴文本编号
  pagenum 文件内的页面
  printopt 可选的输出选项;选择个中二个值:
  0:暗中认可值,输出缓冲区的标题和页面标题
  一:输出缓冲区的标题、页面标题(分别出口每壹行),以及行偏移量表
  2:输出缓冲区的标题、页面标题(全体出口页面),以及行偏移量表
  3:输出缓冲区的标题、页面标题(分别出口每1行),以及行偏移量表;每1行
  后跟分别列出的它的列值
  要想看看那一个输出的结果,还亟需设置DBCC TRA首席试行官N(360四)。

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

我们来进行下列的一声令下:

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

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

保障行长更加短可以使愈来愈多行适合页面, 从而减弱 i/o
并追加所需数据在缓存中的大概。

SQL
Server会给我们包罗5个部分的输出。第贰局地是BUFFE揽胜,里面是有些内部存款和储蓄器分配新闻,对此我们没多少兴趣。下一部分是一直9陆bytes大小的页头(page header),页头(page
header)会类似如下呈现:

 

永利皇宫登录网址 5

行偏移量数组

页头相关字段的含义:

 

  • Page @0x08F84000      
         同BUFFER中的bpage地址
  • m_pageId
    = (一:7玖)              数据页号     
  • m_headerVersion
    = 一         头文件版本号,平素为一          
  • m_type =
    壹                          页面类型,一为数量页面
  • m_typeFlagBits
    = 0x四         数据页和索引页为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 =
    720575940409425九2  存款和储蓄单元的ID,sys.allocation_units.allocation_unit_id                              

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

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

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

    (0:0)                  该数据页的前1页面;主要用在数据页、索引页和IAM页

  • m_nextPage
    = (0:0)                
     该数据页的后壹页面;首要用在数据页、索引页和IAM页

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

  • m_reservedCnt
    = 0                   活动工作释放的字节数

  • m_lsn =
    (25伍:840陆:二)                日志记录号
  • m_xactReserved
    = 0                 最新参与到m_reservedCnt领域的字节数
  • m_xdesId
    = (0:0)                    
      添加到m_reservedCnt的近来的事务id
  • m_ghostRecCnt
    = 0                 幻影数据的行数
  • m_tornBits
    = 0                      
      页的校验位仍旧被由数据库页面爱戴情势决定分页敬服位代表

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

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

每行在那个数组中都有贰个2字节的条款 (正如前边所研讨的,
当您读书每行所需的十一个开辟字节时)。

 永利皇宫登录网址 6

即使这一个字节未有存款和储蓄在数据行中, 但它们确实会潜移默化适合页面的行数。

  • GAM (一:贰) = ALLOCATED
                                                   
      在GAM页上的分配意况
  • SGAM (一:三) = ALLOCATED
                                                 
      在SGAM页上的分配情形
  • PFS (1:1) = 0x61
    MIXED_EXT ALLOCATED 
    50_PCT_FULL 在PFS页上的分配情形,该页为50%满,                       

  • DIFF (1:6) =
    CHANGED

  • ML (1:7) = NOT
    MIN_LOGGED   

 

接下去正是用来存放实际多少的槽(slot),每条记下存放1个槽(slot)里。0号槽在页里具备第壹条数据,一号槽具有第二条数据,以此类推。通过下边包车型地铁图样,你能够看看大家记录大小是2二4bytes,217 bytes(50+50+100+5+四+八) 的定长和七 bytes
的种类行费用。

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

永利皇宫登录网址 7

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

页的最后一片段是行偏移数组表,我们能够用参数为一的DBCC
PAGE命令来,在输出音信的平底获得。

那并不表示行按集中索引键的顺序物理地囤积在页面上。

实施如下的授命:

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

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

正如你在自己研讨其实页面时所看到的那么,
那几个行的情理地方能够放在页面包车型地铁其余岗位。

SQL
Server在输出新闻的底层,给我们如下的消息:

 

永利皇宫登录网址 8

网站地图xml地图