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 页。
我发现这里引用了这一点,但没有明确解释:
Run Code Online (Sandbox Code Playgroud)-- 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.
谷歌上没有显示其他有意义的结果。
我有权访问的数据库有多个文件,因此没有一个满足大小要求。
在新创建的 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)
归档时间: |
|
查看次数: |
821 次 |
最近记录: |