数据库[转]SQL Server 二〇〇九存储结构之GAM、SGA

作者:数据库

DBCC 页面命令包蕴表6-6 中显示的参数。

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

  那么什么样查看页面新闻吗,从SQLServer2004起便起头提供了一个读取数据页结构的授命DBCC Page。该命令为非文档化的吩咐,具体如下:

 数据库 1

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

         96 = 页头大小 96 bytes       

  dbid               富含页面包车型的士数据库ID

里头,最终三个参数能够是0,1,2,3,默以为0,有意思味的朋友能够相比下这么些参数的差别。咱们作个示例:

与 SQL server 中的全部其余类型的页同样, 数据页的大小固定为 8 KB 或8192字节。

大家来实践下列的下令:

                            0:暗中同意值,输出缓冲区的标题和页面标题

DBCC traceON(3604)
go
--查询testdb数据库的第三个文件的第157页的数据页
DBCC PAGE (testdb,1,157,1);
GO

固然那么些字节未有存款和储蓄在多少行中, 但它们确实会影响契合页面包车型地铁行数。

数据库 2

  PAGE HEADEKuga那有些剧情仅有通过DBCC PAGE(TESTDB,1,2,2)即全部出口页面本领够表现;通过与地点表格的对峙统黄金时代,大家勉强能识别部分相关存款和储蓄新闻;当那有个别缺点和失误官方文书档案的支撑,为了幸免无谓的疑忌,所以有时就不做深刻探讨了。

 http://support.microsoft.com/?scid=kb;en-us;83065&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

在 DBCC 页的出口中, 您能够见见此页富含23行, 第意气风发行 (由插槽0提示) 从偏移量 1585 (0x631) 开头。

数据库 3

  DATA 部分

DBCC traceON(3604)
GO

如图6-4 所示, 页标题攻克种种数据页的前九十多个字节 (为数量、行费用和行偏移保留80九十几个字节)。表6-5 列出了检查页标题时体现的生龙活虎部分消息。

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

数据库 4  

数据库 5

最侧面的列包罗数据的 ASCII 字符表示格局。 此列中唯有字符数据是可读的, 就算只怕会来得有个别其余数据。

余下的 36 bytes (8192-96-8060卡塔尔国保留给槽数组(Slot array卡塔 尔(英语:State of Qatar)或然其余转发行回来指针(forwarding row back pointer卡塔 尔(阿拉伯语:قطر‎(每条10 bytes卡塔 尔(阿拉伯语:قطر‎。这就表示多少个页不自然就能够保留18(36/2)条记下。槽数组(Slot array卡塔 尔(英语:State of Qatar)依据你的记录数从下往上升高。假若记录长度小,页里就足以储存越多的记录,偏移表也会自下而上占用越来越多的长空。 

  dbname       包涵页面包车型大巴数据库的称号

因此,作为系统框架结构师或数据库Designer,实在有不可缺少领悟那么些啊。邀月深有体会。呵呵。程序很烂,是后天的,但数据结构不创造,那是天然的,两个的杀伤力相仿惊人!

反倒, 偏移量数组中的插槽0引用集中索引键顺序中的第意气风发行, 插槽1援引第二行, 由此及彼。

在我们谈谈在SQL Server里,数据页内部结构具体是如何早先,大家来创建二个表并插入一些记录。

第8页

 此中:状态位A富含一个有关行的位图新闻。那一个bits好似下含义:

而是, 由于平常无需查阅数据页的内容, 由此在 SQL server 文书档案中找不到有关 DBCC 页的音信。

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

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

 DBCC page命令能够帮我们查询:MSDN文书档案中中并未有提供此命令,微软真的很非常啊。语法为:

请留意, DBCC TRA首席实行官N (3604) 提示 SQL server 将结果重回给顾客端。

咱俩来执行下列的吩咐:

  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页音信及相应列值  

数据库 6

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

数据库 7

  那多个数据文件是精通于指标操作系统文件,在那之中三个是叫行数据文件,用来存款和储蓄数据库的各个对象,其它三个是日记文件,平素记录数据变动的长河。

 

清单6-4 中的代码和结果展现来自 DBCC 页的演示输出, 其 printopt 值为1。

页的结尾生机勃勃有的是行偏移数组表,大家得以用参数为1的DBCC PAGE命令来,在输出新闻的尾巴部分得到。

PAGE: (1:3)

《Microsoft Sql server 二〇一〇 Internals》索引目录:

利用具备 printopt 值1或3的 DBCC 页表示插槽地点, 即每行的6个表存款和储蓄257、页上的行的偏移量和行的尺寸。

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

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

 

页题方今面是储存表实际数据行的区域。单个数据行的最大尺寸为8060字节的行内数据。

SQL Server会给大家富含4个部分的出口。第1片段是BUFFEXC60,里面是有些内部存款和储蓄器分配音信,对此大家相当少兴趣。下黄金年代部分是牢固96 bytes大小的页头(page header卡塔尔,页头(page header卡塔 尔(阿拉伯语:قطر‎会接近如下展现:

  当一张表或一个目录须求越多的半空中时,SQL Server供给找到能够用来分配的空中。假设该表或索引全部依然有限8个页面,SQL Server必得找到能够用来分配的混杂类型区构成的上空。如若表或索引有8个页面或更加大,SQL Server必须找到一个随意的联合类型的区。

      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.

查阅数据页

  • 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、Data Rows for in-Rows

页标题

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

  统意气风发类型的区 那个区为单个对象具有,区中全部的8个数据页只好被所属对象使用。

举例你想得到消息系统硬件的连锁音讯,能够因此DBCC traceON(3205)伸开追踪按钮。  

"偏移量表" 部分显得页面末尾的行偏移量数组的内容。

以此行偏移表,应该从下往上读。每条槽条约是三个2 bytes长的指针指向页里槽偏移量。这里我们插入了2条记下,所以表里有2个槽条款。第1条记下指向第96 bytes,正万幸页头后。这么些行偏移表能够扶持我们管理页面包车型地铁笔录。在页里的行偏移表里,每条记下要求2 bytes的分寸来储存。于此相似,在堆表上创造的非集中索引,各类非集中索引行里都含有一个物理指针映射回堆表里的行记录。那个物理指针是[文件号:页号:槽号](file:page:solt卡塔尔国的协会,由此在读取页的时候,能够找到堆表里的对应行,再经过行偏移表里槽号里的偏移量,就能够在页里读取到相应的行记录。假如大家要校订页中间的笔录,我们并不一定供给整合全部页,我们假设修正偏移表里偏移量即可。

  从第1玖拾叁个字节开首(页面总是从第0个字节开首的),到第1玖拾玖个字节,那多个字节代表已分配的分区的境况。即0000C0。

后后生可畏篇大家将三番一遍读书固定长度的行和可变长度的行的存款和储蓄。真累啊!

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

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

N/A

行偏移数组(row offset array) 是二个2-byte entries的块(block),每种项表明对应数据行在页早先的偏移,每行(row)有八个两字节的项。就算这一个字节不会和数量一齐存款和储蓄在行中,它们能影响适应page的行数。行偏移数组表露了行在页上的逻辑顺序。举个例子,假使三个表有四个集中索引,SQL Server按聚焦索引键的依次寄存数据。那并不意味数据是情理按聚焦索引键的次第寄存,而是行偏移数组的Slot 0 指向集中索引键系列的第大器晚成行(row),Slot 1 指向第二行,等等。当大家要快快查看实际页的时候,这么些行的大意地点只怕在页的任何任务。

正如所寓指标, DBCC 页的出口分为四重半数以上: 缓冲区、页标题、数据和偏移量表 (实际上是偏移量数组)。

今日大家曾经明白了页的组织,我们大器晚成道来小结下。

  本章大家任重(Ren Zhong卡塔尔国而道远介绍GAM页和SGAM页,其余页面类型会稍后介绍。

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)

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

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 二〇〇二,第八个参数是可选的,该参数用于钦定一个分区号.假若不给定值大概给定0, 则呈现整个分区数据。
和DBCC PAGE不一致的是, SQL Server运营DBCC IND不须要开启3604追踪标识.

 
   以下为DBCC PAGE(TESTDB,1,3,3)拿到的连锁音信,有野趣的能够和20ee20做一下相对而言。

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

如前所述, 数据页有三种, 每一种都是分歧的格式存款和储蓄数据。

接下去正是用来寄存实际数据的槽(slot卡塔尔国,每条记下存放贰个槽(slot卡塔尔国里。0号槽在页里具备第1条数据,1号槽具备第2条数据,由此及彼。通过上面包车型客车图纸,你能够见到我们记录大小是224 bytes,217 bytes(50 50 100 5 4 8卡塔尔 的定长和7 bytes 的类别行费用。

  BUFFER部分:

除此以外,还大概有更详细的第X到第X行的数额体现。更加多音信,请查看:

实际上存款和储蓄在页面上的首先行实际上是6行, 而行偏移量数组中的偏移量为96。printopt 值为1的 DBCC 页呈现 "插槽编号" 顺序中的行, 即便能够从每种插槽的偏移量中看出, 亦不是在页面上实在存在行的依次。

数量页由3个部分组成。页头(标头卡塔尔国,数据区(数据行和可用空间卡塔尔国及行偏移数组。

  数据库被分为若干逻辑页面(各个页面8KB),何况在每种文件中,全部页面都被三回九转地从0到x编号,当中x是由文件的朗朗上口决定的。大家得以由此点名一个数据库ID、叁个文本ID、三个页码来引用任何一个数据页。每种数据页则用来存储表和目录,甚至相关的数据库管理新闻。

 Page Header的上面是row data,单个数据行最大能够存放8060 bytes的in-row data,那正是早前数据行不可能超过8060节制的缘由!有个别行也得以在独立的页面(pages)中存放row-overflow data和LOB数据,存款和储蓄在四个加以的page变量中的行数决意于表结构及数码被寄存的构造。四个全体一切坚持住长度列的表每页能累积相符的行数。贰个享有可变长度列的表在页中贮存差异的行数以适应数据的骨子里尺寸。保持行长度尽量短,允许更多的行以适应页面,裁减了I/O,改过了高速缓存命中率(cache-hit ratio)。

 

  • 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   

m_type=13

 

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

执行如下的通令:

  以下截图是由此SQLServer2009的Internals Viewer插件见到的风姿罗曼蒂克体化页面结构,该插件是从

有意思的是,当您成立叁个表的时候,固定长度的列是先被储存的,例如那样一个言辞

 

数据库 8

数据库 9  

  注意,要想赢得雷同上海教室的查询的绵密音信,必得选取展开TRA老总N按钮,语法为:

在给定页上囤积的行数依照表结交涉仓库储存的数目而生成。

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

【IT168专稿】聊起GAM和SGAM,大家只能从数据库的页和区提起。八个数据库由顾客定义的空间整合,这么些空间用来永世存款和储蓄客户对象,举例数据库管理音讯、表和目录。这一个空间被分配在贰个或多个操作系统文件中。

下表展现了表数据行的积攒音讯:

本文由ca88发布,转载请注明来源

关键词: ca88网址 01.数据库基础 page SQL Server 存