数据库SQLServer如何管理区分配和可用空间
2014-01-23 17:46
357 查看
下面使用图示的方式给你讲解数据如何管理分区和可用空间
用来管理区分配情况并跟踪可用空间的 SQL Server 数据结构相对而言比较简单。这有下列好处:
可用空间信息被紧密压缩,因此包含此信息的页相对较少。
这样,可提高速度,因为它减少了检索分配信息时所需的磁盘读取量。同时还可增加分配页保留在内存中的机会并且不需要更多的读操作。
大多数分配信息不是链在一起的。这就简化了对分配信息的维护。
可以快速执行每个页的分配或释放。这将减少需要分配页或释放页的并发任务之间的争用。
管理区分配
SQL Server 使用两种类型的分配映射表来记录区的分配:
全局分配映射表 (GAM)
GAM 页记录已分配的区。每个 GAM 包含 64,000 个区,相当于近 4 GB 的数据。GAM 用一个位来表示所涵盖区间内的每个区的状态。如果位为 1,则区可用;如果位为 0,则区已分配。
共享全局分配映射表 (SGAM)
SGAM 页记录当前用作混合区且至少有一个未使用的页的区。每个 SGAM 包含 64,000 个区,相当于近 4 GB 的数据。SGAM 用一个位来表示所涵盖区间内的每个区的状态。如果位为 1,则区正用作混合区且有可用页。如果位为 0,则区未用作混合区,或者虽然用作混合区但其所有页均在使用中。
根据区当前的使用情况,GAM 和 SGAM 中每个区具有以下位模式。
这将简化区管理算法。若要分配统一区,数据库引擎将在 GAM 中搜索为 1 的位,并将其设置为 0。若要查找具有可用页的混合区,数据库引擎将在 SGAM 中搜索为 1 的位。若要分配混合区,数据库引擎将在 GAM 中搜索为 1 的位,将其设置为 0,然后将 SGAM 中对应的位设置为 1。若要释放区,数据库引擎确保将 GAM 位设置为 1,将 SGAM 位设置为 0。实际上,数据库引擎内部使用的算法比本主题中介绍的更为复杂,因为数据库引擎在数据库中均匀分布数据。但是,由于无需管理区分配信息链,因此即使是实际算法也会被简化。
页可用空间 (PFS) 页记录每页的分配状态,是否已分配单个页以及每页的可用空间量。PFS 对每页都有一个字节,记录该页是否已分配。如果已分配,则记录该页是为空、已满 1% 到 50%、已满 51% 到 80%、已满 81% 到 95% 还是已满 96% 到 100%。
将区分配给对象后,数据库引擎将使用 PFS 页来记录区中的哪些页已分配或哪些页可用。数据库引擎必须分配新页时,将使用此信息。保留的页中的可用空间量仅用于堆和 Text/Image 页。数据库引擎必须找到一个具有可用空间的页来保存新插入的行时,使用此信息。索引不要求跟踪页的可用空间,因为插入新行的点是由索引键值设置的。
在数据文件中,PFS 页是文件头页之后的第一页(页码为 1)。接着是 GAM 页(页码为 2),然后是 SGAM 页(页码为 3)。第一个 PFS 页之后是一个大小大约为 8,000 页的 PFS 页。在第 2 页的第一个 GAM 页之后还有另一个 GAM 页(包含 64,000 个区),在第 3 页的第一个 SGAM 页之后也有另一个 SGAM 页(包含 64,000 个区)。下图显示了数据库引擎用来分配和管理区的页顺序。
相关文章推荐
- Sql Server 管理区分配(GAM,SGAM)和可用空间(PAM)的原理
- SQLServer如何查看数据库中表占用的磁盘空间(转)
- 如何在服务器上开通 sql server 2008 r2 数据库空间,如何创建用户,如何分配权限
- [SqlServer]如何向数据库插入带有单引号(')的字符串
- 创建数据库表空间和分配用户权限
- ios 如何获取手机可用空间和总的存储空间的大小
- SQLSERVER 2008 如何获取一个数据库中的所有表的名称、一个表中所有字段的名称
- 如何让类对象只在栈(堆)上分配空间?
- 基于无域故障转移群集 配置高可用SQLServer 2016数据库
- 如何设计数据库实现灵活处理权限分配
- 如何让对象只在堆或者栈中分配空间ANDC++禁止一个类被继承
- 如何查看SQLSERVER中某个查询用了多少TempDB空间
- 如何使用sql查询数据库表结构的设计(sqlserver,oracle)
- 求助,如何使用批处理命令查询本机有几个盘,然后每个盘总大小空间和可用大小空间,然后将这些信息生成一个文档,求高手指教,谢谢。
- 如何向Windows虚拟机分配更多硬盘空间
- 分享一个SQLSERVER脚本(计算数据库中各个表的数据量和每行记录所占用空间)
- 数据库空间管理之数据文件分配(初)
- 分享一个SQLSERVER脚本(计算数据库中各个表的数据量和每行记录所占用空间)
- 解析如何通过SQLServer的数据库邮件来发送邮件
- 《More Effective C++》条款27:如何让类对象只在栈(堆)上分配空间?