理解GAM和SGAM页

本文涉及的产品
云数据库 RDS SQL Server,基础系列 2核4GB
RDS SQL Server Serverless,2-4RCU 50GB 3个月
推荐场景:
简介:

我们知道SQL Server在8K 的页里存储数据。分区就是物理上连续的8个页。当我们创建一个数据库,数据文件会被逻辑分为页和区,当用户对象创建时,页会分配给它用来存储数据。GAM(Global Allocation Map)和SGAM(Shared Global Allocation Map)页用来跟踪SQL Server里空间分配情况。这里我们会一起讨论下SQL Server的空间分配,还有GAM和SGAM怎么帮助我们分配空间。

在SQL Server里有2类区:

统一区(Uniform Extent) :区属于一个用户对象。这些区的所有8页归一个对象所有。

混合区(Mixed Extent) :区属于各个用户对象。即区里的每个页都可以属于不同用户对象。

为了更好的管理空间分配,如果一个表或索引大小小于8页(即64k),SQL Server会分配混合区的页,而不是统一区的页。

我们在SQL Server里验证下。

新建一个表(这个表刚好一条记录一个页面),并插入26条记录,并通过DBCC IND查看这个表的相关页面:

复制代码
 1 USE InternalStorageFormat
 2 GO
 3 
 4 IF EXISTS ( SELECT  *
 5             FROM    sysobjects
 6             WHERE   id = OBJECT_ID(N'[dbo].[TestSpaceAllocation]')
 7                     AND OBJECTPROPERTY(id, N'IsUserTable') = 1 )
 8     DROP TABLE dbo.TestSpaceAllocation
 9 
10 CREATE TABLE TestSpaceAllocation(
11    Name CHAR(8000)
12 )
13 GO
14 
15 INSERT INTO TestSpaceAllocation VALUES('Woody')
16 GO 26
17 
18 DBCC IND('InternalStorageFormat','TestSpaceAllocation',1) 
复制代码

从上图我们可以清楚的看到,绿色区域的第一个8页不属于同个区(混合区),因为页面号不连续,207与94752之间有缺口。接下来蓝色红色区域是属于同个区(统一区),因为它们的页面号是连续的。当我们以碎片级别来看待这个情况时,可以发现表越小,碎片越高。即使你用索引重建,这个高碎片也不会减少。这个背后的原因就是SQL Server分配新的表或索引对象时,总是首先从混合区分配空间。
SQL Server为新表或索引从混合区开始分配页。一旦表增长超过8页。SQL Server需要从统一区分配页。当表或索引为新的或修改的数据需要更多的容纳空间时,SQL Server需要这些表或索引分配页。如果表或索引的大小小于8页。SQL Sever需要从混合区给它们分配空间。如果大小超过8页,SQL Server需要从统一区分配页。SQL使用2类不同的页来更好管理这个分配操作。

全局分配映射表(GAM: Global Allocation Map Pages) :GAM页记录哪些些区已被使用分配。对于每个区,GAM都有一个位。如果这个位是1,表示对应的区是空闲可用的。如果这个位是0,表示对应区被统一区或混合区使用。一个GAM页可以保存64000个区的使用信息。这就是说,一个GAM可以保存近4G(64000 * 8 * 8/ 1024)数据文件的使用信息。简单来说,一个7G的数据文件会有2个GAM页。
共享全局分配映射表(SGAM: Shared Global Allocation Map Pages) :SGAM页记录哪些区已被作为混合区使用并至少有一个可用的空闲页。对于每个区,SGAM都有一个位。如果这个位是1,表示对应的区作为混合区使用并至少有一个可用的空闲页。如果这个位是0,表示这个区既没被混合区使用(作为统一区),或这个区的所有页都作为混合区使用了。一个SGAM页可以保存64000个区的使用信息。这就是说,一个SGAM可以保存近4G(64000 * 8 * 8/ 1024)数据文件的使用信息。简单来说,一个7G的数据文件会有2个SGAM页。

GAM和SGAM页帮助数据库引擎进行区管理。分配一个区,数据库引擎查找标记1的GAM页,然后标记为0。如果那个区是作为混合区分配,它会在SGAM页把对应区的标记为1。如果那个区是作为统一区分配,那就没有必要在SGAM里修改对应位标记。找一个有空页的混合区,数据库引擎在SGAM页查找标记为1的位。如果没找到,数据文件已经满了。解除一个区分配,数据库引擎会把对应GAM页里对应位设置为1,SGAM页里对应标记设置为0。

在每个数据文件里,第3个页(页号2,页号从0开始)是GAM页,第4个页(页号3,页号从0开始)是SGAM页。第1个页(页号0)是文件头(file header),第2个页(页号1)是PFS(Page Free Space)页。我们可以使用DBCC PAGE命令查看GAM和SGAM页。

我们在AdventureWorks2008R2数据库里验证下:

复制代码
1 USE AdventureWorks2008R2
2 
3 DBCC TRACEON(3604)
4 GO
5 DBCC page('AdventureWorks2008R2',1,2,3)
复制代码

输出的结果最后一个部分:

第1行表示,在页0到页23112之间的区都已经被分配,也就是说页号从0到23129的页都被分配。

第2行表示,在页23120到页25072之间的区都没被分配,也就是说页号从22120到页25079的页都未被分配。

我们一起来看看分配的页23112和未分配的页23120在页头分配信息里的GAM分配情况。

1 DBCC TRACEON(3604)
2 GO
3 DBCC page('AdventureWorks2008R2',1,23112,1)

1 DBCC TRACEON(3604)
2 GO
3 DBCC page('AdventureWorks2008R2',1,23120,1)

可以看到在GAM页的分配信息和在对应页里页头的分配信息(Allocation Statu)是一致的。

我们来看看SGAM页的分配情况:

1 DBCC TRACEON(3604)
2 GO
3 DBCC page('AdventureWorks2008R2',1,3,3)

第1行表示,在页0到页11752之间的区都已经未被分配,也就是说这些区没被分配,或者是统一区,或者是没有空页的混合区,这里应该是统一区。

第2行表示,自页11760的区开始是混合区,并且至少有1个可用的页。


本文转自Woodytu博客园博客,原文链接:http://www.cnblogs.com/woodytu/p/4487310.html,如需转载请自行联系原作者

相关实践学习
使用SQL语句管理索引
本次实验主要介绍如何在RDS-SQLServer数据库中,使用SQL语句管理索引。
SQL Server on Linux入门教程
SQL Server数据库一直只提供Windows下的版本。2016年微软宣布推出可运行在Linux系统下的SQL Server数据库,该版本目前还是早期预览版本。本课程主要介绍SQLServer On Linux的基本知识。 相关的阿里云产品:云数据库RDS SQL Server版 RDS SQL Server不仅拥有高可用架构和任意时间点的数据恢复功能,强力支撑各种企业应用,同时也包含了微软的License费用,减少额外支出。 了解产品详情: https://www.aliyun.com/product/rds/sqlserver
相关文章
|
11月前
|
存储 缓存 算法
【OSTEP】分页: 快速地址转换(TLB) | TLB命中处理 | ASID 与页共享 | TLB替换策略: LRU策略与随机策略 | Culler定律
【OSTEP】分页: 快速地址转换(TLB) | TLB命中处理 | ASID 与页共享 | TLB替换策略: LRU策略与随机策略 | Culler定律
222 0
|
11月前
|
存储 算法 关系型数据库
第21章_InnoDB数据页结构
第21章_InnoDB数据页结构
57 0
|
12月前
|
存储 缓存 关系型数据库
【介绍一下Page页的结构】
【介绍一下Page页的结构】
|
机器学习/深度学习 存储 计算机视觉
Segment-Anything的一些相关论文总结
Segment-Anything的一些相关论文总结
302 1
|
存储 程序员 内存技术
4.1页式存储
计算机组成原理之页式存储
152 0
|
监控 Linux
物理内存 虚拟内存 页映射模式
物理内存 虚拟内存 页映射模式
141 0
物理内存 虚拟内存 页映射模式
|
前端开发 开发者
分类页-顶部通栏 |学习笔记
快速学习 分类页-顶部通栏
146 0
分类页-顶部通栏 |学习笔记
|
SEO
如何优化网站权重页?
通过目标关键词和长尾关键词的概念,做SEO的目的分为两类,用首页去做目标关键词,用内容页面和栏目页面去优化长尾关键词。 网站收录是有一些规律,以搜外网为例: 1、首页https://www.fgba.net/因为大量的站内和站外链接的关系,往往是收录会比较好; 2、首页上长期链接的一些内页链接,如下图,他们基本都被良好收录了,而且权重很大;
162 0
如何优化网站权重页?
|
搜索推荐 UED SEO
SEO聚合页和专题页的区别
我们在优化网站时接触聚合和专题页面,对搜索引擎来说,相关的聚合和专题页面的质量很高,所以合理利用这两个页面可以配置很多关键词,今天就seo中的聚合页面和专题页面的不同进行说明。
SEO聚合页和专题页的区别