>

[转]SQL Server 二〇〇八存款和储蓄结构之GAM、SGA

- 编辑:乐百家599手机首页 -

[转]SQL Server 二〇〇八存款和储蓄结构之GAM、SGA

 

SQL Server会给大家如下的出口结果:
图片 1

  SGAM页面

  注意,要想博得相近上图的查询的绵密音讯,必得采用张开TRA高管N按键,语法为:

项目清单6-4 中的代码和结果突显来自 DBCC 页的亲自去做输出, 其 printopt 值为1。

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

第279页

 检查数据页(Exampling Data Pages)

虽说那一个字节未有存款和储蓄在多少行中, 但它们确实会影响符合页面包车型的士行数。

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

  当一张表或二个索引需求越多的上空时,SQL Server须要找到能够用来分配的长空。如若该表或索引全部照旧有限8个页面,SQL Server必需找到能够用来分配的混杂类型区构成的空间。借使表或索引有8个页面或更加大,SQL Server必需找到三个随机的会面类型的区。

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

只有系统管理员本事选取 DBCC 页。

图片 2

  那四个数据文件是无可纠纷的操作系统文本,当中二个是叫行数据文件,用来积累数据库的各个对象,其它二个是日记文件,一向记录数据变动的进度。

《Microsoft Sql server 2009Internal》读书笔记--目录索引

页标题

图片 3

  统后生可畏类型的区 那几个区为单个对象拥有,区中全数的8个数据页只可以被所属对象使用。

3、Row Offset Array

DBCC 页面命令包涵表6-6 中显得的参数。

 

  SQL Server能够神速地锁定三个文本中的GAM页面,因为它总是位于任何数据库文件的第三页上(页码为2)。SGAM页面是在第四页上(页码为3)。下几个GAM页面出以往首先个GAM页面(页码为2)将来的每511 2叁10个页面中,何况下一个SGAM页面出将来第4个SGAM页面(页码为3)以后的每511 2二十四个页面中。每二个数据库文件的页码为0的页面是文件头页面,而且每一个文件唯有意气风发页。页码0是头文件页,页码1是页面自由空间页(Page Free Space,PFS)。

图片 4

 

那么些行偏移表,应该从下往上读。每条槽条约是二个2 bytes长的指针指向页里槽偏移量。这里我们插入了2条记下,所以表里有2个槽条款。第1条记下指向第96 bytes,刚巧在页头后。这么些行偏移表能够补助咱们管理页面包车型大巴笔录。在页里的行偏移表里,每条记下须求2 bytes的深浅来囤积。于此肖似,在堆表上确立的非聚焦索引,每一个非聚焦索引行里都包罗叁个物理指针映射回堆表里的行记录。那么些物理指针是[文件号:页号:槽号](file:page:solt卡塔 尔(英语:State of Qatar)的构造,因而在读取页的时候,能够找到堆表里的对应行,再通过行偏移表里槽号里的偏移量,就足以在页里读取到对应的行记录。假诺大家要改过页中间的记录,大家并不一定须要组合全体页,大家只要修改偏移表里偏移量就能够。

 

中间,最终四个参数能够是0,1,2,3,默感觉0,有意思味的意中人能够相比下那么些参数的差距。大家作个示例:

从 DBCC 页的 "输出" 页标题部分显得页上全数标题字段的数目。

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

  SQL Server使用二种奇特类型的页面来记录哪些区已经被分配出去了,哪些项目(混合类型或联合类型)的区可供使用:

 http://support.microsoft.com/?scid=kb;en-us;83065&x=8&y=12

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

 图片 5

  在SQLServer二零零六的每贰个数据库中的前八页顺序都以定位的。

 

 

SQL Server把多少记录存在数据页(Data Page卡塔 尔(阿拉伯语:قطر‎里。数据记录是堆表里、集中索引里叶子节点的行。

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

 图片 6

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

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

                           1:输出缓冲区的标题、页面标题(分别出口每生龙活虎行),以至行偏移量表

 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

 

图片 7

图片 8  

图片 9

 

图片 10

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

正如上海体育场所所示,每一个data page (除去96 bytes,还应该有8096 bytes存放data,row overhead和row offset)。你能够使用下边包车型大巴DBCC Page命令来查看。

行数据分为三局地。

         96 = 页头大小 96 bytes       

m_type=1

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)

(表6-5 展现了超多这个字段的意义。数据节包罗每行的音信。

1 DBCC IND('InternalStorageFormat','Customers',-1)
BUF @0x03585CD8 每一次清空缓存再次查询,地址都会改变
bpage = 0x060B4000 每一次清空缓存再次查询,地址都会改变
bhash = 0x00000000 相对不变
bpageno = (1:2) 当前页面地址
bdbid = 8 sys.databases.database_id
breferences = 1 每一次清空缓存再次查询,地址都会改变
bUse1 = 41490 每一次清空缓存再次查询,地址都会改变
bstat = 0xc00009 相对不变
blog = 0x59ca2159 相对不变
bnext = 0x00000000 相对不变

幽默的是,当你创建一个表的时候,固定长度的列是先被积攒的,比如那样三个言语

 

今天大家要寻觅SQL Server给那一个表分配的页有啥样,这几个将在动用非文档的下令DBCC IND。
它的语法如下:

  数据库举办空间管理的渺小单位为区(extents)。

下表突显了表数据行的存放音信:

持有全体固定长度列的表始终可以积存每页相符的行数;

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

【IT168专稿】聊起GAM和SGAM,大家只好从数据库的页和区提起。二个数据库由客户定义的上空组成,那几个空中用来恒久存款和储蓄客商对象,例如数据库管理新闻、表和目录。那些空中被分配在三个或七个操作系统文件中。

 个中:状态位A包蕴三个关于行的位图音讯。那个bits好似下含义:

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

图片 11

图片 12  

有关DBCC TRA老板N (Transact-SQL)的更加多用法,请参见MSDN

保险行长更加短能够使愈来愈多行相符页面, 进而减弱 i/o 并追加所需数据在缓存中的只怕。

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

   DATA部分日常分为若干插槽号(Slot),如若是数据页或索引页的话,可以通晓为风度翩翩行记录,SQLServer通过文件号 页面号 插槽号用来唯生龙活虎标记表中的每一条记下。但在GAM页中大家得以把Slot 0精晓为GAM页的保存页,共计玖拾肆个字节。

2、Data Rows for in-Rows

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

在咱们探讨在SQL Server里,数据页内部结构具体是哪些从前,大家来创造三个表并插入一些记下。

第N页

 数据页(Data pages)是包含已经增添到数据库的表中的客商数量的结构。正如前方所看见的,数据页有三类,每类数据页以不相同的不二秘技存款和储蓄数据。复习一下,分别是in-row data pages、row-overflow data pages和LOB data pages。与别的连串的page同样,data pages也是一贯的8K分寸或8192 bytes。它由三类组件组成:the page Header,data rows和the row offset array,如下图所示:

行偏移量数组

SQL Server在输出消息的尾部,给我们如下的音信:

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

CREATE TABLE dbo.Demotable2010( 
               int PKID,not null
               emp_fname  varchar(10)   NOT NULL, 
               phone      char(12)      NOT NULL, 
               job_level  smallint      NOT NULL 
);

图片 13

今昔咱们早已知晓了页的结构,大家一起来小结下。

第0页 第1页 第2页 第3页 第4页 第5页 第6页 第7页
m_type=15 m_type=11 m_type=8 m_type=9 m_type=0 m_type=0 m_type=16 m_type=17
头文件页 PFS页 GAM页 SGAM页 保留页 保留页 DCM页 BCM页

 

最左侧的列蕴涵数据的 ASCII 字符表示格局。 此列中唯有字符数据是可读的, 固然可能会来得某个别的数据。

接下去正是用来存放实际数目标槽(slot卡塔 尔(阿拉伯语:قطر‎,每条记下存放四个槽(slot卡塔 尔(英语:State of Qatar)里。0号槽在页里具有第1条数据,1号槽具备第2条数据,就那样推算。通过上边包车型大巴图纸,你能够看来大家记录大小是224 bytes,217 bytes(50 50 100 5 4 8卡塔 尔(阿拉伯语:قطر‎ 的定长和7 bytes 的系统行开支。

  GAM和SGAM页的总的大小为81玖拾伍个字节;文件头为九十几个字节,slot 0为91个字节,slot 1的头顶的体系音信为4个字节,尾巴部分的种类音讯为13个字节,所以有效储存应该为79九十个字节,63904个区,5112贰拾四个页;事实受愚数据文件超越约4G的时候,大家将能在第511232页、 第511233页分别找到其对应的GAM、SGAM页面。

行偏移数组(row offset array) 是三个2-byte entries的块(block),种种项表明对应数据行在页开首的偏移,每行(row)有一个两字节的项。就算这一个字节不会和数码一同存款和储蓄在行中,它们能影响适应page的行数。行偏移数组透露了行在页上的逻辑顺序。比如,假设八个表有四个集中索引,SQL Server按聚集索引键的逐黄金年代存放数据。那并不意味数据是物理按集中索引键的后生可畏豆蔻梢头存放,而是行偏移数组的Slot 0 指向聚集索引键连串的第豆蔻梢头行(row),Slot 1 指向第二行,等等。当大家要高效查看实际页的时候,这几个行的轮廓地点或然在页的任何地方。

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

能够看看有2条记下,一条记下为页面类型(PageType卡塔尔国为10的页和一条记下为页面类型(PageType卡塔尔为1的页。页面类型(PageType卡塔 尔(英语:State of Qatar)10是IAM页,页面类型(PageType卡塔尔国1是数据页,它的页ID是79.

未分配

 DBCC page命令能够帮大家询问:MSDN文书档案中中未有提供此命令,微软真的十分特别啊。语法为:

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

  • 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   

  本章我们注重介绍GAM页和SGAM页,别的页面类型会稍后介绍。

《Microsoft Sql server 二零零六 Internals》索引目录:

查阅数据页

页是 8KB 的分寸,即 8192 bytes,固定 96 bytes的尺寸给页头使用,接下去是实际的数量以槽的秘籍存款和储蓄。数据记录的最大尺寸是 8060 bytes(蕴涵 7 bytes的系统行开销卡塔 尔(英语:State of Qatar),因此一条记下中您有所的最大字节数是 8053 bytes。下列的表成立语句会战败。

图片 14  

故此,作为系统架构师或数据库Designer,实在有须要领悟那些啊。邀月深有体会。呵呵。程序很烂,是后天的,但数据结构不创制,那是原始的,两个的杀伤力相似惊人!

本文由乐百家数据库发布,转载请注明来源:[转]SQL Server 二〇〇八存款和储蓄结构之GAM、SGA