简介

我们已经知道SQL Server IO最小的单位是页,连续的8个页是一个区。SQL Server需要一种方式来知道其所管辖的数据库中的空间使用情况,这就是GAM页和SGAM页。

Global Allocation Map Page

GAM(全局分配位图)是用于标识SQL Server空间使用的位图的页。位于数据库的第3个页,也就是页号是2的页。下面我们通过新建一个数据库来看其GAM的结构。创建测试数据库的代码如代码所示。

CREATE DATABASE [test] ON  PRIMARY
( NAME = N'test', FILENAME = N'C:\Test\test.mdf' , SIZE = 3072KB , MAXSIZE = UNLIMITED, FILEGROWTH = 1024KB )LOG ON
( NAME = N'test_log', FILENAME = N'C:\Test\test_log.ldf' , SIZE = 2048KB , MAXSIZE = 2048GB , FILEGROWTH = 10%)
GO

代码1.创建测试数据库

数据库创建成功后,通过查看数据库页号为2的页。我们看到如图1所示的结果。

图1.GAM页示例

我们看到页内的数据通过16进制表示。也就是一个数字是4比特,两个是一字节。其中前4个字节0000381f是系统信息,slot1的后10个字节也是系统信息。其余的每位表示SQL Server的一个区的状态,0表示已分配,1表示未分配。下面我们就通过图1所示的GAM页来计算一下这个数据库所占的空间。

我们可以看到,由于数据库刚刚创建,分配的空间在第4-8个字节就能表示,也就是0001c0ff。下面将0001c0ff由16进制化为2进制。结果是

0000 0000 0000 0001 1100 0000 1111 1111

通过计算,可以看出,上面的bit中有21个0,也就是目前数据库已经分配了21个区,我们知道每个区是8*8k=64K。因此算出这个数据库占用空间(21*64)/1024=1.3125MB≈1.31MB

下面我们通过SSMS来看数据库实际占用的空间,如图2所示。

图2.通过SSMS来看数据库所占的空间

通过上面的计算3-1.69=1.31MB和通过GAM页进行计算的结果完全吻合。

那可能大家会有疑问了,那如果数据库增长超过一个GAM所能表示的区的范围那该怎么办?答案很简单,就是再创建一个GAM页,第二个GAM页的位置也可以通过图1中的信息进行计算。图1中slot1有7992个字节,其中前四个字节用于存储系统信息,后面7988字节用于表示区的情况,因此所能表示的区是7988*8=63904,横跨的页的范围是511232,所以第511232+1页应该是下一个GAM页,而页号就会是511232页。这个区间也就是所谓的GAM Interval,接近4GB。

Shared Global Allocation Map Page

通过GAM页可知,分配空间的最小单位是区。但假如一个非常小的索引或是表只占1KB,但要分给其64K的空间就显得过于奢侈了。所以当几个表或索引都很小时,可以让几个表或索引公用一个区,这类区就是混合区。而只能让一个表或索引使用的区就是统一区。SGAM位于数据库的第四页,也就是GAM的下一个页。页号为3。通过和GAM相同位置的bit组合,就能知道空间的状态。所能表示的几种状态如表1所示。

  GAM SGAM位
未分配 1 0
统一区或空间使用完的混合区 0 0
含有可分配空间的混合区 0 1

表1.SGAM和GAM

通过SGAM和GAM的组合,SQL Server就能知道该从哪里分配空间。

第二个SGAM页位于第二个GAM页之后,也就是页号为511233的页。依此类推。

SQL Server中的GAM页和SGAM页相关推荐

  1. Sql Server 中 GAM、SGAM、PAM、IAM、DCM 和 BCM 的详解与区别

    Sql Server 中 GAM.SGAM.PAM.IAM.DCM 和 BCM 的详解与区别 GAM.SGAM.PAM.IAM.DCM 和 BCM 都是 SQL Server 中用来管理空间分配的一些 ...

  2. SQL Server :理解GAM和SGAM页 01

    SQL Server在8K 的页里 存储 数据.分区就是物理上连续的8个页.当我们创建一个 数据库 ,数据文件会被逻辑分为页和区,当用户对象创建时,页会分配给它用来存储数据.GAM(Global Al ...

  3. sql 闩锁 原因_关于SQL Server中的闩锁

    sql 闩锁 原因 SQL Server locks, discussed in the article All about locking in SQL Server, which is appli ...

  4. predicate 列存储索引扫描_在SQL SERVER中导致索引查找变成索引扫描的问题分析

    SQL Server 中什么情况会导致其执行计划从索引查找(Index Seek)变成索引扫描(Index Scan)呢? 下面从几个方面结合上下文具体场景做了下测试.总结.归纳. 1:隐式转换会导致 ...

  5. 在SQL Server中保存和输出任意类型的文件

    我们可以把任意类型的文件保存到SQL Server中,在进行例子之前,先建立测试用表格,TestFile.sql: if exists (select * from dbo.sysobjects wh ...

  6. SQL SERVER中什么情况会导致索引查找变成索引扫描

    原文:SQL SERVER中什么情况会导致索引查找变成索引扫描 SQL Server 中什么情况会导致其执行计划从索引查找(Index Seek)变成索引扫描(Index Scan)呢? 下面从几个方 ...

  7. SQL Server中的执行引擎入门

    简介 当查询优化器(Query Optimizer)将T-SQL语句解析后并从执行计划中选择最低消耗的执行计划后,具体的执行就会交由执行引擎(Execution Engine)来进行执行.本文旨在分类 ...

  8. 十步优化SQL Server中的数据访问

    故事开篇:你和你的团队经过不懈努力,终于使网站成功上线,刚开始时,注册用户较少,网站性能表现不错,但随着注册用户的增多,访问速度开始变慢,一些用户开始发来邮件表示抗议,事情变得越来越糟,为了留住用户, ...

  9. 【转】在SQL Server中通过SQL语句实现分页查询

    在SQL Server中通过SQL语句实现分页查询 2008年01月06日 星期日 12:28 建立表: CREATE TABLE [TestTable] ( [ID] [int] IDENTITY ...

最新文章

  1. oracle11g程序调优纪实
  2. python源代码不需要编译成什么-编译 Python 源代码
  3. 项目托管到Github
  4. 性能提升约 7 倍!Apache Flink 与 Apache Hive 的集成
  5. VTK修炼之道82:VTK管线机制_信息对象类VTKInformation
  6. VTK修炼之道62:体绘制_固定点光线投影体绘制与GPU加速光线投影体绘制
  7. 百度地图软件测试,使用 app-inspector 解析 i 调用百度地图定位的页面时 (iOS),会导致测试 app 崩溃...
  8. pythonsvc_sklearn-SVC实现与类参数详解
  9. docker修改容器ip范围
  10. Idea查看 破解码
  11. 阿里云短信发送 错误 请检查模板内容与模板参数是否匹配
  12. JavaWeb查漏补缺
  13. 用python求圆的表面积_【用python写一组类(class)对应各种几何体(正方体,长方体,球,圆柱)的表面积和体积的编码】作业帮...
  14. Win8.1 IE11 浏览器无法打开任何网页的解决办法
  15. 真人快打11 技能键位
  16. 手机连接电脑热点 显示 连接超时,已解决
  17. 2020年汽车驾驶员(中级)模拟考试题及汽车驾驶员(中级)考试软件
  18. Fatal error: Uncaught ArgumentCountError: Too few arguments to function 解决方法
  19. 自学系列 | 就谈兴趣!
  20. 惨烈!2018年这些企业“阵亡”了…

热门文章

  1. linux 安装mysql
  2. win10 rabbitMQ的安装与测试
  3. html页面转换成pdf
  4. excel 2010 学习笔记一 Vlookup 函数的使用
  5. Peter Cnudde谈雅虎如何使用Hadoop、深度学习和大数据平台
  6. 谈谈对Spring IOC的理解
  7. 微软开发团队的DevOps实践启示
  8. IIS6.0限制上传文件大小的解决办法
  9. 你的斗地主能拿多少炸?
  10. 【Node.js】2.开发Node.js选择哪个IDE 开发工具呢