有几个关于 SQL Server 内部结构的问题。
假设我们在数据库中有一个表。
SGAM 和 GAM 页面在单个 GAM 间隔(~4GB)内跟踪共享和统一的范围,并帮助我们在分配页面/范围时找到合适的范围类型(最初前 8 个页面是从混合范围分配的,这些页面的位置是记录器到 IAM 页面,然后从 GAM 范围(统一范围)和此信息存储在下一个链接的 IAM 页面中)。
比方说,为表分配了页,表大小超过 8 页,稍后,行被删除,留下一些可重用的空间。SQL Server 如何知道范围有可用空间?
页面有关于可用空间大小的信息,但是检查每个页面太耗时。SGAM 和 GAM 页面中的位不会告诉我们除了扩展已分配或有一些空闲页面(整个页面是空闲的,而不是部分的)之外的任何信息。
文件头 & SGAM & GAM & IAM 页面是文件中的第一页。什么数据结构实际上指向它们?
SQL Server 在内部使用PSF 页面跟踪页面、堆表以及 LOB 页面中的可用空间。
此外,您可以使用
sys.dm_db_file_space_usage
DMV 来查找total_page_count
,allocated_extent_page_count
以及unallocated_extent_page_count
在数据库中查找。单击此处放大- 使用 DBCC PAGE 输出
参考:存储引擎内部:GAM、SGAM、PFS等分配图
我不明白这个问题。最小的存储单位是页。八个 8K 页面构成一个范围。以下是数据页的组成部分:
我强烈建议阅读 SQLSkills.com 博客,其中 Paul 和他的团队发布了很多关于SQL Server 内部结构的博客。