sys.dm_db_page_info (Transact-SQL)

适用于:SQL Server 2019 (15.x) Azure SQL 数据库Azure SQL 托管实例

返回有关数据库页面的信息。 该函数将返回包含页中标头信息的一行,包括 object_idindex_idpartition_id。 在大多数情况下,此函数取代了使用 DBCC PAGE 的需要。

注意

sys.dm_db_page_info 当前仅在 SQL Server 2019 (15.x) 及更高版本中受支持。

语法

sys.dm_db_page_info ( DatabaseId , FileId , PageId , Mode )

参数

DatabaseId | NULL | DEFAULT

数据库的 ID。 DatabaseIdsmallint。 有效的输入为数据库的 ID 号。 默认值为 NULL,但为此参数发送 NULL 值将导致错误。

FileId | NULL | DEFAULT

文件的 ID。 FileId 为 int。有效输入为 DatabaseId 指定的数据库中文件的 ID 号。 默认值为 NULL,但为此参数发送 NULL 值将导致错误。

PageId | NULL | DEFAULT

页面的 ID。 PageId 为 int。有效输入为 FileId 指定的文件中页面的 ID 号。 默认值为 NULL,但为此参数发送 NULL 值将导致错误。

Mode | NULL | DEFAULT

确定函数输出中的详细信息级别。 'LIMITED' 将返回所有说明列的 NULL 值,“DETAILED”将填充说明列。 DEFAULT 上声明的默认值为 'LIMITED'

返回的表

列名称 数据类型 描述
database_id int 数据库 ID。

在 Azure SQL 数据库中,这些值在单一数据库或弹性池中是唯一的,但在逻辑服务器中不是唯一的。
file_id int 文件 ID
page_id int 页面 ID
page_header_version int 页面页眉版本
page_type int 页面类型
page_type_desc nvarchar(64) 页面类型的说明
page_type_flag_bits nvarchar(64) 页面页眉中的类型标志位
page_type_flag_bits_desc nvarchar(64) 页面页眉中的类型标志位说明
page_flag_bits nvarchar(64) 页面页眉中的标志位
page_flag_bits_desc nvarchar(256) 页面页眉中的标志位说明
page_lsn nvarchar(64) 日志序列号/时间戳
page_level int 索引中的页面级别(叶 = 0)
object_id int 拥有页面的对象 ID
index_id int 索引的 ID(堆数据页面的 0)
partition_id bigint 分区 ID
alloc_unit_id bigint 分配单元的 ID
is_encrypted bit 用于指示是否已加密页面的位
has_checksum bit 用于指示页面是否具有校验和值的位
校验和 (checksum) int 存储用于检测数据损坏的校验和值
is_iam_pg bit 用于指示页面是否为 IAM 页面的位
is_mixed_ext bit 用于指示是否在混合区中分配的位
has_ghost_records bit 用于指示页面是否包含虚影记录的位
虚影记录是已标记为要删除但尚未删除的记录。
has_version_records bit 用于指示页面是否包含用于加速数据库恢复的版本记录的位
pfs_page_id int 相应 PFS 页面的页面 ID
pfs_is_allocated bit 用于指示页面是否在相应的 PFS 页面中标记为已分配的位
pfs_alloc_percent int 由相应的 PFS 字节指示的分配百分比
pfs_status nvarchar(64) PFS 字节
pfs_status_desc nvarchar(64) PFS 字节的说明
gam_page_id int 相应 GAM 页面的页面 ID
gam_status bit 用于指示是否在 GAM 中分配的位
gam_status_desc nvarchar(64) GAM 状态位的说明
sgam_page_id int 相应 SGAM 页面的页面 ID
sgam_status bit 用于指示是否在 SGAM 中分配的位
sgam_status_desc nvarchar(64) SGAM 状态位的说明
diff_map_page_id int 相应差异位图页面的页面 ID
diff_status bit 指示差异状态是否已更改的位
diff_status_desc nvarchar(64) 差异状态位的说明
ml_map_page_id int 相应最小日志记录位图页面的页面 ID
ml_status bit 用于指示页面是否为最少日志记录的位
ml_status_desc nvarchar(64) 最少日志记录状态位的说明
prev_page_file_id smallint 上一页文件 ID
prev_page_page_id int 上一页页面 ID
next_page_file_id smallint 下一页页面文件 ID
next_page_page_id int 下一页页面 ID
fixed_length smallint 固定大小行的长度
slot_count smallint 槽总数(已用和未用)
对于数据页面,此数字等效于行数。
ghost_rec_count smallint 页面上标记为虚影的记录数
虚影记录是已标记为要删除但尚未删除的记录。
free_bytes smallint 页面上的可用字节数
free_data_offset int 数据区域末尾可用空间的偏移量
reserved_bytes smallint 所有事务预留的可用字节数(如果是堆)
虚影行数(如果是索引叶)
reserved_bytes_by_xdes_id smallint 由 m_xdesID to m_reservedCnt 贡献的空间
仅用于调试目的
xdes_id nvarchar(64) m_reserved 贡献的最新事务
仅用于调试目的

注解

sys.dm_db_page_info 动态管理函数返回页面页眉中存在的信息,如 page_idfile_idindex_idobject_id 等等。 此信息适用于疑难解答和调试各种性能(锁和闩锁争用)与损坏问题。

在许多情况下可以使用 sys.dm_db_page_info 来代替 DBCC PAGE 语句,但它仅返回页面页眉信息,而不返回页面正文。 对于需要页面全部内容的用例,仍然需要 DBCC PAGE

与其他 DMV 结合使用

其中一个重要 sys.dm_db_page_info 用例是将其与其他公开页面信息的 DMV 联接。 为了方便此用例,添加了一个名为 page_resource 的新列,它以 8 字节十六进制格式公开页面信息。 此列已添加到 sys.dm_exec_requestssys.sysprocesses,且未来将根据需要添加到其他 DMV。

新函数 sys.fn_PageResCrackerpage_resource 作为输入,并输出包含 database_idfile_idpage_id 的的单行。 然后,可以使用此函数促进 sys.dm_exec_requestssys.sysprocessessys.dm_db_page_info 之间的联接。

权限

需要数据库中的 VIEW DATABASE STATE 权限。

SQL Server 2022 及更高版本的权限

需要对数据库拥有 VIEW DATABASE PERFORMANCE STATE 权限。

示例

A. 显示页面的所有属性

以下查询返回一行,其中包含给定 database_idfile_idpage_id 组合的所有页面信息,默认模式(“LIMITED”)

SELECT *
FROM sys.dm_db_page_info (5, 1, 15, DEFAULT);

B. 将 sys.dm_db_page_info 与其他 DMV 一起使用

当行包含非 null wait_resource 时,以下查询返回 sys.dm_exec_requests 公开的每个 page_resource 一行

SELECT page_info.*
FROM sys.dm_exec_requests AS d
CROSS APPLY sys.fn_PageResCracker(d.page_resource) AS r
CROSS APPLY sys.dm_db_page_info(r.db_id, r.file_id, r.page_id, 'LIMITED') AS page_info;

另请参阅