SQL Server页面结构深入分析

  

SQL Server存储数据的基本单元是页面,每一个页面的大小是8 kb,数据文件是由页面构成的。在同一个数据库上,每一个页面都有一个唯一的资源标识,标识符由三部分组成:db_id, file_id, page_id,例如,15:1:8733,15是数据库的ID, 1是数据文件的ID, 8733是页面的编号,页面的编号从0依次递增。8个连续的页面组成一个区(程度),数据文件中已分配(分配)的空间被分割成区的整数倍。一次磁盘IO操作作用于页面级别,而空间分配的最小单元是区。

  

页面是用于存储数据的,不同类型的页面存储的数据是不同的,页面的结构也是不同的。有些页面是用于存储数据的,叫做数据页面,有些页面是用于存储索引结构中的中间节点的,叫做索引页,有些页面是SQL Server存储引擎使用的,用于管理页面的,叫做系统页。本文关注的是数据和索引页页,跟数据表有关。

  

日志文件没有页面结构,它是由一系列的日志记录构成的。

  

  

每一个页面都由头部(头),内容(内容)和行偏移量(抵消)组成,头部是在页面的开始处,占用96字节,用于存储页面的编号,页面的类型,分配单元(分配单元)等系统信息。注:在单个页面中最多存储8060字节的数据。

  

最大的数据量和开销都包含在单个行alt=" SQL Server页面结构深入分析">

  

数据行存储在页眉之后,数据行在页面中的物理存储是无序的,行的逻辑顺序是由行偏移(行抵消)确定的,行偏移存储在页面的末尾,每一个行偏移是一个槽位,占用2 b。行偏移连续排列在页面的末尾,称作槽数组(槽阵列)。行偏移以倒序方式存储行的偏移量,这意味着,从末页尾向页面开头计数,第一行的偏移量存储在页面的末尾槽中,第二行的偏移量存储在末页尾的第二个插槽中。

  

  

页面头部信息存储的是页面的系统信息,可以使用非正式的命令来查看:

        DBCC页面(“数据库名称”|数据库id, file_id, page_number, print_option=[0 | 1 | 2 | 3])      

参数:file_id是数据库文件的ID; page_number页面是在当前文件中的编号;print_option是指打印信息的详细程度,默认值是0,只打印页眉。

  

例如,查看资源标识符:15:1:8777733页面的头部信息:

        dbcc traceon (3604)   dbcc(15日1,8777733页)      

在我的数据库中,该页面的头部信息(移除缓冲区的数据)如下所示,

        页面(1:8777733):      页眉:   页面@0x0000005188B02000      m_pageId=(1:8777733) m_headerVersion=1 m_type=1   m_typeFlagBits=0 x0 m_level x220=0 m_flagBits=0   m_objId (AllocUnitId.idObj)=28503 m_indexId (AllocUnitId.idInd)=256   元数据:AllocUnitId=72057595905900544   元数据:PartitionId=72057594059423744元数据:IndexId=1   元数据:ObjectId=1029578706 m_prevPage=(1:8777732) m_nextPage=(1:8777734)   pminlen=16 m_slotCnt=2 m_freeCnt=4513   m_freeData=https://www.yisu.com/zixun/3675 m_reservedCnt=0 m_lsn=(1212327:16:558)   m_xactReserved=0 m_xdesId=(0:799026688) m_ghostRecCnt=0   m_tornBits=-1518328013 DB碎片弹ID=1      配置状态   股份公司(1:8690945)子公司后继承分配GAM(1:8690944)==不分配   PFS分配0 (1:8775480)=0 x40 _pct_full DIFF(1:8690950)=改变   毫升(1:8690951)=不是MIN_LOGGED      

页面头部中各个字段的含义:

  

1、页面的编号

  

m_pageId=(1:8777733),该页面所在文件的ID和页面ID

  

2,页面的类型

  

m_type=1,页面的类型,常见的类型是数据页和索引页:

  

1 -数据页,用于表示:堆表或聚集索引的叶子节点
  2 -索引页,用于表示:聚集索引的中间节点或者非聚集索引中所有级别的节点
  其他页面类型(系统页是管理页面的页面,例如,联欢,我等)如下:

  

3 -混合文本页面,4 -文本树页面,用于存储类型为文本的大对象数据
  7 -页面,用于存储排序操作的中间数据结果
  8 - GAM页面,用于存储全局分配映射数据GAM(全球配置地图),每一个数据文件被分割成4 gb的空间块(块),每一个块都对应一个GAM数据页,GAM数据页出现在数据文件特定的位置处,一个点映射当前一部分中的一个区。
  股份公司页面,子公司后继承9 -用于存股份公司页子公司后继承储(共享GAM)
  10 -我页面,用于存储我页(索引分配地图)
  11 - PFS页面,用于存储PFS页(自由空间页)
  13 -引导页面,用于存储数据库的信息,只有一个页面,页面的标识符是:db_id: 1:9,

SQL Server页面结构深入分析