发布于 2023-03-30 12:18:16
我有一个结核病大小的数据库。应该有大量的GAM页面可供查找。
让我们先来看看这些文档的进展情况。4GB是524,288页。将此偏移量添加到第1页的2中,并使用DBCC页,不会返回GAM页。搜索两个区段,任何一方都不会返回GAM页面。
64,000页是512,000页。查看第512,002页,它的邻居也不会返回GAM页面。这些似乎都是粗略的近似,而不是关于文件结构的硬事实。
让我们再次检查第一个GAM页面的标题。
dbcc traceon(3604);
dbcc page('Sandbox', 1, 2, 0);m_prevPage和m_nextPage都是零。没有可遵循的页面链。
不过,m_slotCnt是2。我想知道不同的记录代表什么?使用dbcc page('Sandbox', 1, 2, 1);显示第一个记录的长度为94,第二个记录的长度为7,992。因为每个GAM位代表一个范围,7992字节代表511,488页。遗憾的是,在这种抵消的空隙中也没有GAM页面。稍后再谈这个。
现在,这个博客建议分配位图可能没有槽数组。因此,当我询问每一行信息时,DBCC可能会感到困惑,而这两个“记录”实际上是一个连续的位图。这样做可以得到517,504页,但不幸的是,没有第二个GAM页面。
再次查看第2页,但这次我看到了详细的逐行解释(选项3)。
(1:0) - (1:369568) = ALLOCATED
(1:369576) - = NOT ALLOCATED
(1:369584 - (1:511224) = ALLOCATED我找到了一个描述这里 (在第3.GAM节下),它说:"511224是这个范围内最后一个范围的第一页。“所以下一个范围的第一页是511232。因为这将是一个新的GAM范围的开始,我希望找到另一个GAM页面。它在第511232页。
重复这一点,我发现更多的GAM页面在1022464,1533696和2044928。两者之间的间隔是一致的511232。我的结论是,这是GAM间隔的步幅。为了检查一下,我取了一个任意的倍数511232 * 127 = 64926464,当然,它也是一个GAM页面。
向后工作511232页是63,904个区段,即GAM页面映射中的7988字节。这比我在插槽2中找到的7992个记录少了4个,这恰好是记录头的长度。我应该意识到的。
发布于 2023-03-30 17:48:23
很长一段时间以来,这在很多地方都有记载。我第一次看到这篇文章是在2012年的这篇博文中:
这些页面的标识也包括在服务提供商_WhoIsActive中,通过这段代码:
CASE
WHEN x.page_no = 1 OR x.page_no % 8088 = 0 THEN 'PFS'
WHEN x.page_no = 2 OR x.page_no % 511232 = 0 THEN 'GAM'
WHEN x.page_no = 3 OR (x.page_no - 1) % 511232 = 0 THEN 'SGAM'
WHEN x.page_no = 6 OR (x.page_no - 6) % 511232 = 0 THEN 'DCM'
WHEN x.page_no = 7 OR (x.page_no - 7) % 511232 = 0 THEN 'BCM'
WHEN x.page_no IS NOT NULL THEN '*'
ELSE NULL
END AS page_type对于任何想要识别其他重要页面类型的读者来说,这可能是有用的。
https://dba.stackexchange.com/questions/325398
复制相似问题