首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >GAM间隔的步长是多少?

GAM间隔的步长是多少?
EN

Database Administration用户
提问于 2023-03-30 12:18:16
回答 2查看 702关注 0票数 7

出于兴趣,我正在阅读Microsoft文件的内部 构筑物。很明显,IAM页面是如何连接的。但是,我不清楚以后的GAM页面会在哪里找到。

第一个GAM页面是每个文件中的第2页。DBCC页面确认了这一点。上面的链接在"4GB“或"64,000区段”之后还有另一个GAM页面。当我在那些地方(它们不是相同的号码)时,我找不到一个GAM页面。

在Server数据文件中,我将在第一个GAM页面之外找到多少页( GAM间隔的“步幅”)?

EN

回答 2

Database Administration用户

发布于 2023-03-30 12:18:16

我有一个结核病大小的数据库。应该有大量的GAM页面可供查找。

让我们先来看看这些文档的进展情况。4GB是524,288页。将此偏移量添加到第1页的2中,并使用DBCC页,不会返回GAM页。搜索两个区段,任何一方都不会返回GAM页面。

64,000页是512,000页。查看第512,002页,它的邻居也不会返回GAM页面。这些似乎都是粗略的近似,而不是关于文件结构的硬事实。

让我们再次检查第一个GAM页面的标题。

代码语言:javascript
复制
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)。

代码语言:javascript
复制
(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个,这恰好是记录头的长度。我应该意识到的。

票数 9
EN

Database Administration用户

发布于 2023-03-30 17:48:23

很长一段时间以来,这在很多地方都有记载。我第一次看到这篇文章是在2012年的这篇博文中:

  • GAM:页ID =2或页ID % 511232
  • 页ID =3或(页ID -1)% 511232
  • PFS:页ID =1或页ID % 8088

这些页面的标识也包括在服务提供商_WhoIsActive中,通过这段代码

代码语言:javascript
复制
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

对于任何想要识别其他重要页面类型的读者来说,这可能是有用的。

票数 8
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/325398

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档