有几个关于sql Server内部结构的问题。

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

  1. SGAM和GAM页面在单个GAM间隔(~4gb)内跟踪共享和统一范围,并帮助我们在分配页面/范围时找到适当的范围类型(最初前8个页面从混合范围分配,这些页面的位置记录到IAM页面,之后从GAM范围(统一范围),这些信息存储在下一个链接的IAM页面中)。

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

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

  2. 文件头&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页面输出

enter image description here

参考 : 存储引擎内部:GAM、SGAM、PFS等分配图

文件头&SGAM&GAM&IAM页是文件中的第一页。什么数据结构实际上指向他们?

我不明白这个问题。存储的最小单位是页面。八个8k页面形成一个范围。以下是a的组成 数据页:

enter image description here

我强烈推荐阅读SQLSkills.com 博客,其中保罗和他的团队博客很多关于 SQL Server内部.

许可以下: CC-BY-SA归因
不隶属于 dba.stackexchange
scroll top