您的位置:澳门新葡8455最新网站 > 数据库管理 > 理解数据页结构,Server内幕之数据页

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

发布时间:2019-10-11 21:46编辑:数据库管理浏览(82)

    数据页是饱含已增加到数据库表中的客商数据的构造。

    作者们都很清楚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 3000,第八个参数是可选的,该参数用于钦赐多个分区号.借使不给定值只怕给定0, 则展现全体分区数据。
    和DBCC PAGE不相同的是, SQL Server运营DBCC IND无需开启3604追踪标识.

    如图6-4 所示, 页标题攻陷每个数据页的前九十六个字节 (为数量、行开销和行偏移保留80100个字节)。表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个部分的输出。首盘部是BUFFEENVISION,里面是有个别内部存款和储蓄器分配信息,对此大家没有多少兴趣。下一部分是定点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 = 0x7000          页面标记
    • 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字节的条目款项 (正如后边所评论的, 当您读书每行所需的13个开拓字节时)。

     澳门新葡萄京娱乐场 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

    查看数据页

    本条行偏移表,应该从下往上读。每条槽条目款项是一个2 bytes长的指针指向页里槽偏移量。这里大家插入了2条记下,所以表里有2个槽条目款项。第1条记下指向第96 bytes,刚还好页头后。那些行偏移表能够扶助大家管理页面包车型大巴笔录。在页里的行偏移表里,每条记下须要2 bytes的深浅来囤积。于此类似,在堆表上确立的非聚焦索引,各类非集中索引行里都含有三个物理指针映射回堆表里的行记录。那个物理指针是[文件号:页号:槽号](file:page:solt)的布局,由此在读取页的时候,能够找到堆表里的对应行,再经过行偏移表里槽号里的偏移量,就足以在页里读取到相应的行记录。就算大家要修改页中间的笔录,大家并不一定必要结合全体页,大家如若修改偏移表里偏移量就能够。

     

    澳门新葡萄京娱乐场 9

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

    在页头大家来看最近页面还也有7644 bytes能够用,我们共同来申明下。

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

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

    独有系统管理员才具应用 DBCC 页。

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

    而是, 由于平日不需求查阅数据页的剧情, 因而在 SQL server 文书档案中找不到关于 DBCC 页的音信。

             96 = 页头大小 96 bytes       

    可是, 假使您想选用它, 上边是语法:

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

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

         7 * 2 = 每条记下的类别行费用 * 记录数

     

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

    DBCC 页面命令包涵表6-6 中展现的参数。

    今天我们曾经清楚了页的构造,我们联合来小结下。

    清单6-4 中的代码和结果呈现来自 DBCC 页的亲自过问输出, 其 printopt 值为1。

    页是 8KB 的尺寸,即 8192 bytes,固定 96 bytes的深浅给页头使用,接下去是具体的数额以槽的法门存款和储蓄。数据记录的最大尺寸是 8060 bytes(包蕴 7 bytes的种类行费用),由此一条记下中你有着的最大字节数是 8053 bytes。下列的表创建语句会战败。

    请小心, DBCC TRACOON (3604) 提示 SQL server 将结果重回给顾客端。

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

    例如未有此 traceflag, 则不会为 DBCC 页命令归来输出。

    澳门新葡萄京娱乐场 10

     

    剩余的 36 bytes (8192-96-8060)保留给槽数组(Slot array)大概别的转发行回来指针(forwarding row back pointer)(每条10 bytes)。那就代表贰个页不确定就会保留18(36/2)条记下。槽数组(Slot array)依照你的记录数从下往上抓实。假设记录长度小,页里就可以积攒越来越多的记录,偏移表也会自下而上占用更加多的长空。 

    澳门新葡萄京娱乐场 11

    参照文章:

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

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

    缓冲香港区域市政局地显得有关给定页的缓冲区的音信。

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

     

    从 DBCC 页的 "输出" 页标题部分显得页上具有标题字段的数码。

    (表6-5 呈现了非常多这一个字段的意思。数据节富含每行的新闻。

    应用拥有 printopt 值1或3的 DBCC 页表示插槽位置, 即每行的6个表存款和储蓄257、页上的行的偏移量和行的尺寸。

    行数据分为三有的。

     

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

    高中档部分含有存款和储蓄在页面上的实在多少, 每五列展现四个十六进制数字。

    最侧面的列富含数据的 ASCII 字符表示格局。 此列中只有字符数据是可读的, 固然恐怕博览会示有些其余数据。

    "偏移量表" 部分显得页面末尾的行偏移量数组的从头到尾的经过。

     

    在 DBCC 页的出口中, 您能够阅览此页富含23行, 第一行 (由插槽0指令) 从偏移量 1585 (0x631) 起初。

    实在存款和储蓄在页面上的率先行实际上是6行, 而行偏移量数组中的偏移量为96。printopt 值为1的 DBCC 页展现 "插槽编号" 顺序中的行, 纵然能够从每一个插槽的偏移量中来看, 亦不是在页面上实际存在行的逐个。

    假使应用 printopt 值为2的 DBCC 页, 则会看见页的有所80九十九个字节 (标头之后) 的转储, 按它们存储在页面上的顺序排列。

     

    本文由澳门新葡8455最新网站发布于数据库管理,转载请注明出处:理解数据页结构,Server内幕之数据页

    关键词: