1.2 区的分配方式
1.2.1 数据页
SQL Server 有以下 4 种类型的数据页,用于保存数据。
(1)行内数据页
此类数据页用于保存 IN_ROW_DATA 页。
(2)索引页
索引页用于保存索引数据。
(3)文本/图像页
这种类型的页用于保存文本数据类型(text 或 ntext)和图像数据类型(image)的 LOB_DATA 和 ROW_OVERFLOW 页。
(4)索引分配映射(Index Allocation Map,缩写为 IAM)页
IAM 页用于保存一个表或索引使用的区的信息。IAM 页类似于 Windows 的文件分配表,它按照数据页的顺序存放数据页的指针。每一个 IAM 页大约可以记录 512,000 个数据页(约 4GB),SQL Server还可以增加更多的 IAM 页,从而记录更多的数据页。
如果表和索引使用分区功能,则每个分区的每个物理文件都会有自己的 IAM 页。而且 IAM 页只能记录一种类型的数据页。例如,某个数据库拥有4个分区,每个分区都有2个小于4GB的物理文件,每个分区都同时存储了3种类型的数据页(行内数据、行溢出数据和LOB),则该数据库将有24个 IAM 页面。
当向一个空表插入一条新记录时,至少会产生两个页,第一页是数据页,第二页是 IAM 页。sys.Sytem_internals_allocation_units 表存放第一个数据页和第一个 IAM 页的指针。
1.2.2 空间页
SQL Server 有以下 4 种类型的空间页,用于记录区的空间分配信息。
(1)PFS页
PFS(Page Free Space,即页可用空间)页用于记录每页的分配状态。将区分配给对象后,数据库引擎使用PFS页来记录区中的哪些页已分配或哪些页可用。PFS 对每页都有一个字节,记录该页的空间分配情况,连续8个字节则对应一个区。
位 | 使用说明 |
0 | 保留,始终为0 |
1 | 该页是否已分配 |
2 | 该页是否属于一个混合区 |
3 | 该页是否是一个 IAM 页 |
4 | 该页是否包含幻影或已删除记录 |
5~7 | 取值为0~4分别代表空间使用率为:空、已满 1% 到 50%、已满 51% 到 80%、已满 81% 到 95% 还是已满 96% 到 100% |
对于每个 PFS 页,除去头文件等,有8088字节可用,因此每个 PFS 页可以管理和跟踪8088个页,约 64MB。PFS 页总是出现任何数据库文件的第2个页面(Page ID=1),这个页面之后,每隔8088个页面就会再出现一次。
(2)GAM 页和 SGAM 页
GAM(Global Allocation Map,即全局分配映射) 页记录了可以分配给任何用途的区。GAM对它所涵盖的每个区都有一个位(bit),以0表示正在使用中,以1表示可用。
SGAM(Shared GAM,即共享全局分配映射)页记录了用作混合区的区,并且这些区中至少有一个未使用的页。结构与GAM类似,每个区都有一个位,以1表示是混合区并且可用,以0表示没有用作混合区或页面都已被使用。
如果SQL Server需要找到新的、完全未使用的区,它可以从GAM页中找到值为1的位。
如果SQL Server需要找到包含可用空间的混合区(有一个或多个可用的页面),则它在SGAM中寻找值为1 的位。如果没有找到具有可用的页的混合区,SQL Server会使用GAM页找到一个全新的区,将它分配为混合区,然后使用其中一个页。如果根本没有可用的区,说明文件已经满了。
GAM数据位 | SGAM数据位 | 区的使用情况 |
1 | 0 | 未被使用,可以用于任何用途的区 |
0 | 0 | 统一区,或已全部使用的混合区 |
0 | 1 | 至少含有一个未使用页的混合区 |
对于每个GAM页或SGAM页,除去头文件等,有8000字节(64000位)可用,因此每个GAM页或SGAM页可以涵盖约64000个区,即4GB。GAM页总是出现任何数据库文件的第3个页面(Page ID=2),这个页面之后,每隔511230个页面就会有一个GAM页。SGAM页总是紧跟在GAM页后面的那个页面(Page ID=3)。
当对表进行Drop或Truncate时,将释放该表所占用的所有区(将GAM位设置为1,将SGAM位设置为0),这样会使事务日志记录最小。
(3)DCM 页
DCM(Differential Changed Map,即差异变更映射)页用于记录哪些区在上一次执行数据库完整备份以后又被修改过。这样在下一次差异备份时就只需对发生变更的区进行备份即可。
DCM页总是出现任何数据库文件的第7个页面(Page ID=6),这个页面之后,每隔511230个页面就会有一个DCM页。
(4)BCM 页
BCM(Bulk Changed Map,即批量变更映射)页用于记录哪些区在上一次执行事务日志备份以后又被bulk 操作修改过。
BCM页总是出现任何数据库文件的第8个页面(Page ID=7),这个页面之后,每隔511230个页面就会有一个BCM页。
本文出自 “SQLServer2014丛书” 博客,谢绝转载!