new*_*int 8 sql-server database-internals
有几个关于SQL Server内部结构的问题。
让我们假设我们在数据库中有一个表。
SGAM 和 GAM 页面在单个 GAM 间隔(~4GB)内跟踪共享和统一范围,并帮助我们在分配页面/范围时找到合适的范围类型(最初前 8 个页面是从混合范围分配的,这些页面的位置是记录器到 IAM 页面,然后从 GAM 范围(统一范围)和此信息存储在下一个链接的 IAM 页面中)。
假设为表分配了页面,并且表大小超过 8 个页面,稍后,行被删除,留下一些可重用的空间。SQL Server 如何知道扩展区有可用空间?
页面有关于可用空间大小的信息,但检查每个页面太耗时。SGAM 和 GAM 页面中的位没有告诉我们除了扩展已分配或有一些空闲页面(整个页面是空闲的,不是部分空闲的)之外的任何内容。
文件头 & SGAM & GAM & IAM 页是文件中的第一页。什么数据结构实际上指向它们?
Kin*_*hah 11
SQL Server 如何知道扩展区有可用空间?
SQL Server 在内部使用PSF 页面跟踪页面、堆表以及 LOB 页面上的可用空间。
此外,您还可以使用sys.dm_db_file_space_usageDMV找出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 PAGE 输出

参考:Inside The Storage Engine: GAM, SGAM, PFS and other allocation maps
文件头 & SGAM & GAM & IAM 页是文件中的第一页。什么数据结构实际上指向它们?
我不明白这个问题。最小的存储单位是页。八个 8K 页形成一个范围。以下是数据页的组成:

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