有关SQL Server中的SGAM&GAM和IAM&PFS的几个问题


8

对于SQL Server的内部结构有几个问题。

假设我们在数据库中有一个表。

  1. SGAM和GAM页面在单个GAM间隔(〜4GB)内跟踪共享和统一的扩展区,并帮助我们在分配页面/扩展区时找到合适的扩展区类型(最初从混合扩展区中分配前8页,而这些页面的位置是记录到IAM页,然后再从GAM扩展区(统一扩展区)记录此信息,并将此信息存储在下一个链接的IAM页中。

    假设已分配了该表的页面,并且表的大小超过了8页,并且稍后,行被删除,留下了一些可重用的空间。SQL Server如何知道扩展区具有可用空间?

    页面具有有关可用空间大小的信息,但是检查每个页面都非常耗时。SGAM和GAM页面中的一些内容不会告诉我们分配了扩展的内容或有一些空闲页面(整个页面都是免费的,而不是部分的)。

  2. 文件标题,SGAM,GAM和IAM页面位于文件的第一页中。实际上是什么数据结构指向它们?

Answers:


11

SQL Server如何知道扩展区具有可用空间?

SQL Server在内部使用PSF页跟踪页,堆表以及LOB页中的可用空间。

此外,您还可以使用sys.dm_db_file_space_usageDMV找出total_page_countallocated_extent_page_count以及unallocated_extent_page_count在数据库中。

页面可用空间(PFS)页面记录每个页面的分配状态,是否已分配单个页面以及每个页面上的可用空间量。PFS每页有一个字节,记录是否分配了该页面,如果分配了,则记录该页面是否为空,已满1%到50%,已满51%到80%,已满81%到95%或已满96%到100%。

PFS页面是数据文件中文件头页面之后的第一页(页面编号1)。接下来是GAM页面(第2页),然后是SGAM页面(第3页)。在第一个PFS页之后,大约有8,000页大小的PFS页。在页面2的第一个GAM页面之后还有另一个GAM页面64,000个扩展区,在页面3的第一个SGAM页面之后还有另一个SGAM页面64,000个扩展区。下图显示了数据库引擎用来分配和管理扩展区的页面顺序。

单击此处放大 -使用DBCC PAGE输出

在此处输入图片说明

请参阅:存储引擎内部:GAM,SGAM,PFS和其他分配图

文件标题,SGAM,GAM和IAM页面位于文件的第一页中。实际上是什么数据结构指向它们?

我没有这个问题。最小的存储单位是一页。八个8K页构成一个扩展区。以下是数据页的组成部分

在此处输入图片说明

我强烈建议阅读SQLSkills.com博客,其中Paul和他的团队写了很多有关SQL Server内部的博客。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.