位置: 编程技术 - 正文

SQL Server 2008存储结构之GAM、SGAM介绍(sql2008数据库存放位置)

编辑:rootadmin
当我们创建一个数据库的时候,例如以缺省的方式CREATE DATABASE TESTDB,SQLServer自动帮我们创建好如下两个数据库文件。 这两个数据文件是实实在在的操作系统文件,其中一个是叫行数据文件,用来存储数据库的各种对象,另外一个是日志文件,从来记录数据变化的过程。   从逻辑角度而言,数据库的最小存储单位为页即8kb。   数据库被分成若干逻辑页面(每个页面8KB),并且在每个文件中,所有页面都被连续地从0到x编号,其中x是由文件的大小决定的。我们可以通过指定一个数据库ID、一个文件ID、一个页码来引用任何一个数据页。每个数据页则用来存储表和索引,以及相关的数据库管理信息。   我们顺着上面数据文件的路径可以找到该文件,观察一下新建的数据文件的大小为:   2. MB (2,, 字节)=2,,b/8kb=个页面=个区   数据库进行空间管理的最小单位为区(extents)。   一个区由8个逻辑上连续的页面组成(KB的空间)。为了能够更有效地分配空间,SQL Server 不会为少量的数据向数据表分配整区的空间。SQL Server 有两种类型的区。   统一类型的区 这些区为单个对象所有,区中所有的8个数据页只能被所属对象使用。   混合类型的区 这些区能为最多8个对象共享。   SQL Server为新的表或索引从混合类型的区中分配页面。当该表或索引增长到8个页面时,以后所有的分配都使用统一类型的区。   当一张表或一个索引需要更多的空间时,SQL Server需要找到能够用来分配的空间。如果该表或索引整体仍然少于8个页面,SQL Server必须找到能够用来分配的混合类型区构成的空间。如果表或索引有8个页面或更大,SQL Server必须找到一个自由的统一类型的区。   SQL Server使用两种特殊类型的页面来记录哪些区已经被分配出去了,哪些类型(混合类型或统一类型)的区可供使用:   全局分配映射(Global Allocation Map,GAM)页面 这些页面记录了哪些区已经被分配并用作何种用途。一个GAM页面在它所覆盖空间里针对每一个区都有一个数据位。如果数据位为0,那么对应的区正在使用;如果该数据位为1,那么该区为自由区。一个GAM页面除了页面头部和其他一些需要记入的开销大概有8 字节或者说 位空间可用,所以每个GAM页面可以覆盖 个区,也就是大约4GB的数据。这意味着一个文件的每4GB空间对应一个GAM页面。   共享全局分配映射(Shared Global Allocation Map,SGAM)页面 这些页面记录了哪些区当前被用作混合类型的区,并且这些区需含有至少一个未使用的页面。就像一个GAM页面,每一个SGAM页面覆盖了大约 个区,也就是大约4GB的数据。一个SGAM页面在它所覆盖空间里针对每一个区都有一个数据位。如果数据位为1,那么对应的被使用的区为混合类型,并且该区有一些自由页面;如果数据位为0,那么对应的区不是一个混合类型的区,或者虽然是一个混合类型的区,但是所有的页面都已被使用了。   表4-2显示了基于每一个区当前的使用情况,在GAM和SGAM中该区所对应的比特位模式。 区的当前使用情况GAM比特位设置SGAM比特位设置自由,未使用统一类型或已全部使用的混合区含有自由页面的混合区

  如果SQL Server需要找到一个新的完全没有使用的区,那么它可以使用任何一个在GAM页面中对应的比特位值为1的区。如果SQL Server需要找到一个有着可用空间(有一个或多个自由页面)的混合类型的区,那么它可以寻找一个对应的GAM中的值为0、SGAM中的值为1的区。如果不存在有可用空间的混合类型的区,SQL Server会使用GAM页面来寻找一个全新的区并将其分配为混合类型的区,然后使用该区中的一页。如果根本没有自由区,那么这个文件已经满了。

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

  SQL Server能够迅速地锁定一个文件中的GAM页面,因为它总是位于任何数据库文件的第三页上(页码为2)。SGAM页面是在第四页上(页码为3)。下一个GAM页面出现在第一个GAM页面(页码为2)以后的每 个页面中,并且下一个SGAM页面出现在第一个SGAM页面(页码为3)以后的每 个页面中。每一个数据库文件的页码为0的页面是文件头页面,并且每个文件仅有一页。页码0是头文件页,页码1是页面自由空间页(Page Free Space,PFS)。

  在SQLServer的每一个数据库中的前八页顺序都是固定的。

  除了第9页为数据库的BOOT页以外,从第8页到第页为SQLServer内部系统表的相关存储信息,然后从第页到第页为未分配页面。因为第一页从0开始,所以刚好页,即和我们看到的数据库数据文件的大小完全相等。

第8页第8页第8页第N页第页第页m_type=1m_type=m_type in (1,2,)N/AData页Boot页主要为内部系统表相关信息未分配

  以下截图是通过SQLServer的Internals Viewer插件看到的整体页面结构,该插件是从  备注:TESTDB为新创建的空数据库,没有任何用户自定义对象,直到有建表脚本为止;关于数据库页类型如下所示:类型页面类型名称页面类型描述1Data page堆表和聚集索引的叶子节点数据2Index page聚集索引的非叶子节点和非聚集索引的所有索引记录3Text mixed pageA 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.4Text tree pageA text page that holds large chunks of LOB values from a single column value.7Sort page排序时所用到的临时页,排序中间操作存储数据用的。8GAM page全局分配映射(Global Allocation Map,GAM)页面 这些页面记录了哪些区已经被分配并用作何种用途。9SGAM page共享全局分配映射(Shared Global Allocation Map,GAM)页面 这些页面记录了哪些区当前被用作混合类型的区,并且这些区需含有至少一个未使用的页面。IAM page.有关每个分配单元中表或索引所使用的区的信息PFS page.有关页分配和页的可用空间的信息boot page.记录了关于数据库的信息,仅存于每个数据库的第9页file header page记录了关于数据库文件的信息,存于每个数据库文件的第0页DCM page记录自从上次全备以来的数据改变的页面,以备差异备份BCM page有关每个分配单元中自最后一条 BACKUP LOG 语句之后的大容量操作所修改的区的信息

  实际上SQLServer还包括一些未公开的页面类型,例如type ,type 等等。

  本章我们主要介绍GAM页和SGAM页,其他页面类型会稍后介绍。

  那么如何查看页面信息呢,从SQLServer起便开始提供了一个读取数据页结构的命令DBCC Page。该命令为非文档化的命令,具体如下:

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

  具体参数描述如下:

  dbid 包含页面的数据库ID

  dbname 包含页面的数据库的名称

  filenum 包含页面的文件编号

  pagenum 文件内的页面

  printopt 可选的输出选项;选用其中一个值:

   0:默认值,输出缓冲区的标题和页面标题

   1:输出缓冲区的标题、页面标题(分别输出每一行),以及行偏移量表

   2:输出缓冲区的标题、页面标题(整体输出页面),以及行偏移量表

   3:输出缓冲区的标题、页面标题(分别输出每一行),以及行偏移量表;每一行后跟分别列出的它的列值

  如果要想看到这些输出的结果,还需要设置DBCC TRACEON()。

  如前文所述,GAM页一定存在于该数据库的第二个页面,SGAM页则一定存在于该数据库的第三个页面;而每一个数据库都会存在文件编号为1的数据库文件,所以我们执行以下命令即可。

我们可以看到一个完整的页面分为四个部分;BUFFER、PAGE HEADER、DATA和OFFSET TABLE。

  让我们首先从GAM页开始看起:

  BUFFER部分:

  显示给定页面的缓冲信息,是内存中的结构,用于管理页面,该信息仅当该页面处于内存时才有意义。关于这个部分我们知之甚少,基本上无法找到相关材料。

BUF @0xCD8每一次清空缓存再次查询,地址都会改变bpage = 0xB每一次清空缓存再次查询,地址都会改变bhash = 0x相对不变bpageno = (1:2)当前页面地址bdbid = 8sys.databases.database_idbreferences = 1每一次清空缓存再次查询,地址都会改变bUse1 = 每一次清空缓存再次查询,地址都会改变bstat = 0xc相对不变blog = 0xca相对不变bnext = 0x相对不变

  PAGE HEADER部分:PAGE HEADER部分显示的是该页面上的所有报头字段的数据PAGE HEADER这部分内容只有通过DBCC PAGE(TESTDB,1,2,2)即整体输出页面才能够展现;通过与上面表格的对照,我们勉强能识别一些相关存储信息;当这部分缺乏官方文档的支持,为了避免无谓的猜测,所以暂时就不做深入探讨了。 DATA 部分 DATA部分一般分为若干插槽号(Slot),如果是数据页或索引页的话,可以理解为一行记录,SQLServer通过文件号+页面号+插槽号用来唯一标识表中的每一条记录。但在GAM页中我们可以把Slot 0理解为GAM页的保留页,共计个字节。   从第个字节开始(页面总是从第0个字节开始的),到第个字节,这三个字节代表已分配的分区的情况。即C0。   我们再来看一下DBCC PAGE(TESTDB,1,2,3)的执行结果。 上面显示从第1页到第页已分配,而第页到页未分配,和DBCC PAGE(TESTDB,1,2,2)显示的个页面似乎有些矛盾,实际上是不矛盾的。如前文所述,GAM对未使用的分区标识为0,而对已分配的分区标识为1   1个分区=页,因为前个页面均已分配,所以前两个字节为   从第个页面起到第个页面也均已分配,实际上为6个区为0也就是说连续6个bit为0,一个字节为8个bit,最后两个bit为,所以该字节为 ,在此需要反转一下相关二进制位;反转之后为 即为C0。   最后让我们用Internals Viewer插件看一下GAM页的全貌吧。 SGAM页面 PAGE: (1:3) BUFFER: BUF @0xA7F4 bpage = 0xAE bhash = 0x bpageno = (1:3) bdbid = 8 breferences = 3 bUse1 = bstat = 0xc blog = 0x bnext = 0x PAGE HEADER: Page @0xAE m_pageId = (1:3) m_headerVersion = 1 m_type = 9 m_typeFlagBits = 0x0 m_level = 0 m_flagBits = 0x m_objId (AllocUnitId.idObj)= m_indexId (AllocUnitId.idInd)=0 Metadata: AllocUnitId= Metadata: PartitionId = 0 Metadata: IndexId = 0 Metadata: ObjectId = m_prevPage = (0:0) m_nextPage = (0:0) pminlen = m_slotCnt = 2 m_freeCnt = 6 m_freeData = m_reservedCnt = 0 m_lsn = (::5) m_xactReserved = 0 m_xdesId = (0:0) m_ghostRecCnt = 0 m_tornBits = Allocation Status GAM (1:2)=ALLOCATED SGAM (1:3)=NOT ALLOCATED PFS(1:1)=0x ALLOCATED _PCT_FULL DIFF (1:6) = CHANGED ML (1:7) = NOT MIN_LOGGED DATA: Slot 0, Offset 0x, Length , DumpStyle BYTE Record Type = PRIMARY_RECORD Record Attributes = Memory Dump @0x4FC : e ?..^............. : ?................ : ?................ : ?................ : ?................ : ??????.............. Slot 1, Offset 0xbe, Length , DumpStyle BYTE Record Type = PRIMARY_RECORD Record Attributes = Memory Dump @0x4FC0BE : f ee ?..8. . ......... : ?................ F: ???????????????????........   以下为DBCC PAGE(TESTDB,1,3,3)得到的相关信息,有兴趣的可以和ee做一下对比。 (1:0) - (1:) = NOT ALLOCATED (1:) - = ALLOCATED (1:) - (1:) = NOT ALLOCATED (1:) - (1:) = ALLOCATED (1:) - = NOT ALLOCATED (1:) - (1:) = ALLOCATED (1:) - (1:) = NOT ALLOCATED (1:) - = ALLOCATED (1:) - (1:) = NOT ALLOCATED   最后让我们用Internals Viewer插件看一下SGAM页的全貌吧。 总结一下,关于GAM和SGAM页比较困难的地方:   1、 关于GAM和SGAM页中的BUFFER信息基本无法理解,也找不到相关材料。   2、 PAGE HEADER的部分信息和Slot 0中的一部分信息,也无法找到相关材料。   3、 SGAM页中的NOT ALLOCATED实际上是统一类型区或者已使用完的混合类型的区,而ALLOCATED实际上为含有自由页面的混合区。   4、 GAM页中0代表已分配,1代表自由区;和一般的标志位的含义刚好相反。   5、 GAM和SGAM实际上只分配了个页面,即个区;显示出来的数据内容虽然很多,但后面的分区信息实际上是不存在的。   6、 GAM和SGAM通过DBCC的printopt为3的属性显示出来的页面分配信息看似是断号的。   7、 GAM和SGAM的区信息的字节是通过二级制反转得到的。   GAM和SGAM页的总的大小为个字节;文件头为个字节,slot 0为个字节,slot 1的头部的系统信息为4个字节,尾部的系统信息为个字节,所以有效存储应为个字节,个区,个页;事实上当数据文件超过约4G的时候,我们将能在第页、 第页分别找到其对应的GAM、SGAM页面。

推荐整理分享SQL Server 2008存储结构之GAM、SGAM介绍(sql2008数据库存放位置),希望有所帮助,仅作参考,欢迎阅读内容。

SQL Server 2008存储结构之GAM、SGAM介绍(sql2008数据库存放位置)

文章相关热门搜索词:sqlserver2008存储过程数据转移到mysql8,sqlserver2008存储过程实例,sqlserver2008存储过程 自动生成数据,sqlserver2008存储过程 根据昨天数据生成今天数据,sqlserver2008存储过程实例,sqlserver2008存储过程,sqlserver2008存储过程数据转移到mysql8,sqlserver2008存储过程,内容如对您有帮助,希望把文章链接给更多的朋友!

sql server 安装过程中服务器配置出错解决办法 sqlserver安装过程中服务器配置出错,求助!!!!!!!解决方法:当sql安装导向运行到这里时:请选择:对所有SQLServer服务使用相同的账号:

SQL Server 网络协议深入理解 SQLServer支持四种协议,SharedMemory;TCP/IP;NamedPipes和VirtualInterfaceAdapter(VIA)。代开SQLServer配置管理器之后,会显示一个配置SQLServer服务,SQLServer网络

SQL定时任务作业创建教程 1.打开【SQLServerManagementStudio】,在【对象资源管理器】列表中选择【SQLServer代理】;--2.鼠标右击【SQLServer代理】,选择【启动(S)】,如已启动,可以省

标签: sql2008数据库存放位置

本文链接地址:https://www.jiuchutong.com/biancheng/319109.html 转载请保留说明!

上一篇:SQL server 2008 数据安全(备份和恢复数据库)(SQL Server 2008 数据库有哪些版本?)

下一篇:sql server 2008安装过程中服务器配置出错解决办法(SQL server 2008安装程序遇到以下错误 sku)

  • 多缴纳社保怎么处理
  • 怎么算一般纳税人
  • 一般纳税人减免增值税政策
  • 独立法人和法人独资的区别
  • 金税盘维护费全额抵扣吗
  • 公司没有账目违法吗
  • 新公司筹建期要做账吗
  • 增值税何时需要交税
  • 旅游企业纳税
  • 被投资方宣告发放股票股利
  • 在没有进项票的情况下可以开销售票出去么
  • 企业所得税季报可以更正吗
  • 母公司为子公司担保是利好还是利空
  • 资本溢价能不能退还股东呢
  • 营改增是初次分配还是再分配
  • 报税时其他收入
  • 以资抵债是利空还是利好
  • 无发票材料可以入材料账吗
  • 公司承租厂房装修协议
  • 股权转让收入属于什么
  • 海关进口关税专用缴款书可以抵扣吗
  • 共用水电费税前扣除比例
  • 补交企业所得税怎么填申报表
  • 土地转让增值税计税依据
  • 城市维护建设税减免税优惠政策
  • 期间损益结转怎么结转
  • 公允价值变动损益在利润表哪里
  • 小规模防伪税控服务费280元
  • 投入的生产线应该怎么做
  • 车辆哪些费用计税
  • 累进税率的特点是课税对象的数额越大,税率越
  • 简单介绍下商务洽谈的五个步骤
  • 电脑输入法无法输入中文怎么办
  • 工会举办比赛,参赛人员差旅费可以在工会报销吗
  • PHP:ignore_user_abort()的用法_misc函数
  • mis.off c n
  • vue事件bus
  • 深度学习之bottleneck layer
  • thinkphp怎么用
  • 定额发票借给别人盖别人店的章可以吗
  • 办公用品和低值易耗品节省成本吗
  • ps索引工具怎么用
  • 小规模销项税分录
  • 债务豁免的账务处理
  • sql扩展
  • 公司名下的车怎样领免检标志
  • 固定资产正常报废与非正常报废的会计处理基本相同
  • 银行日记账上月的余额要结转吗
  • 公允价值变动损益和投资收益区别
  • 有留抵税额可以红冲吗
  • 年中未分配利润
  • 研发支出资本化支出在资产负债表哪里体现
  • 个体户不交税会判刑吗?
  • 成本会计核算方法论文怎么写
  • 序时账是明细账吗
  • mysql安装时出现的问题
  • 如何查看mysql连接池
  • w10桌面
  • Windows Server 2003服务器群集创建和配置指南
  • 本地硬盘满了怎么办
  • win8的ie浏览器在哪里
  • win8.1如何更改开始菜单
  • PACKAGER.EXE - PACKAGER是什么进程 有什么用
  • windows7hosts文件
  • win10系统以太网连接图标不见了怎么办
  • 如何搭建环境变量
  • 欢迎使用来电提醒业务是什么意思
  • jquery的使用步骤
  • xcopy复制并改名
  • javascript给表单赋值
  • js 分页插件
  • 安卓实现单选题
  • web开发工程师需要学什么
  • jquery获取元素父级body高度
  • jquery第十章上机
  • 供电代收电费
  • 劳务派遣服务计税
  • 集体产权房产证怎么办
  • 北京税务热线电话
  • 税务申报按季度申报
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设