516855552页是什么页面类型?

Mic*_*een 5 sql-server storage-engine database-internals

SQL Server 跟踪各种内部位图中的页面分配。其中包括全局分配映射 (GAM) 和页面可用空间 (PFS) 页。我们知道 GAM 页面以511232页的设定间隔出现,PFS 页面以 8088 页的设定间隔出现。

如果数据文件足够大,这种重复最终将导致 GAM 和 PFS 中的下一个页面。计算一下,这发生在 1,011 个 GAM 或 63,904 个 PFS 页(页码 516,855,552)之后。这相当于一个略低于 4TB 的操作系统文件。由于单个数据文件的最大大小为 16TB(),因此这是允许的。

我的问题:当单个数据文件达到 4TB 时,哪种页面类型是页面 516855552 - GAM 还是 PFS?另一个去哪儿了?Paul Randal 的这条评论表明它被分流到 GAM 范围内其他未使用的页面之一:

除第一个之外的 GAM 区有 GAM、SGAM、DIFF_MAP、ML_MAP。每 4TB GAM 范围还将有一个 PFS 页。

我发现这里引用了这一点,但没有明确解释:

-- There may be an issue with the ML map page position
-- on the four extents where PFS pages and GAM pages live
-- (at page IDs 516855552, 1033711104, 1550566656, 2067422208)
-- but I think we'll be ok.
Run Code Online (Sandbox Code Playgroud)

谷歌上没有显示其他有意义的结果。

我有权访问的数据库有多个文件,因此没有一个满足大小要求。

Dan*_*man 6

在新创建的 SQL Server 2022 数据库上,下面的脚本显示页面 516855552 是 PFS 页面,516855553 是 GAM 页面。

USE master;
DROP DATABASE IF EXISTS GAMTest;
CREATE DATABASE GAMTest
 ON  PRIMARY 
( NAME = N'GAMTest', FILENAME = N'H:\SqlFiles\GAMTest.mdf' , SIZE = 5TB , MAXSIZE = UNLIMITED, FILEGROWTH = 65536KB )
 LOG ON 
( NAME = N'GAMTest_log', FILENAME = N'G:\SqlFiles\GAMTest_log.ldf' , SIZE = 1GB , MAXSIZE = 1GB );
GO

USE GAMTest;

SELECT file_id, page_id, page_info.page_type_desc
FROM (VALUES(516855552),(516855553)) AS page_numbers(page_number)
CROSS APPLY sys.dm_db_page_info(DB_ID(), 1, page_numbers.page_number, 'DETAILED') AS page_info;
GO
Run Code Online (Sandbox Code Playgroud)