SQL Server中关于SGAM&GAM&IAM&PFS的几个问题
-
28-09-2020 - |
题
有几个关于sql Server内部结构的问题。
让我们假设我们在数据库中有一个表。
SGAM和GAM页面在单个GAM间隔(~4gb)内跟踪共享和统一范围,并帮助我们在分配页面/范围时找到适当的范围类型(最初前8个页面从混合范围分配,这些页面的位置记录到IAM页面,之后从GAM范围(统一范围),这些信息存储在下一个链接的IAM页面中)。
比方说,分配了表的页面,并且表的大小超过8页,稍后,行被删除,留下一些可重用的空间。SQL Server如何知道区具有可用空间?
页面有关于可用空间大小的信息,但检查每个页面太耗时了。SGAM和GAM页面中的位不会告诉我们扩展被分配或有一些空闲页面(整个页面是免费的,而不是部分)。
文件头&SGAM&GAM&IAM页是文件中的第一页。什么数据结构实际上指向他们?
解决方案
SQL Server如何知道区具有可用空间?
SQL Server使用以下方法跟踪页、堆表和LOB页上的可用空间 PSF页面 在内部。
此外,您可以使用 sys.dm_db_file_space_usage
车管局找出答案 total_page_count
, allocated_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页面输出
文件头&SGAM&GAM&IAM页是文件中的第一页。什么数据结构实际上指向他们?
我不明白这个问题。存储的最小单位是页面。八个8k页面形成一个范围。以下是a的组成 数据页:
我强烈推荐阅读SQLSkills.com 博客,其中保罗和他的团队博客很多关于 SQL Server内部.