sys.dm_db_page_info (Transact-SQL)
适用于: SQL Server 2019 (15.x) Azure SQL 数据库 Azure SQL 托管实例
返回有关数据库页面的信息。 该函数将返回包含页中标头信息的一行,包括 object_id
、index_id
和 partition_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。 DatabaseId 为 smallint。 有效的输入为数据库的 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_id
、file_id
、index_id
、object_id
等等。 此信息适用于疑难解答和调试各种性能(锁和闩锁争用)与损坏问题。
在许多情况下可以使用 sys.dm_db_page_info
来代替 DBCC PAGE
语句,但它仅返回页面页眉信息,而不返回页面正文。 对于需要页面全部内容的用例,仍然需要 DBCC PAGE
。
与其他 DMV 结合使用
其中一个重要 sys.dm_db_page_info
用例是将其与其他公开页面信息的 DMV 联接。 为了方便此用例,添加了一个名为 page_resource
的新列,它以 8 字节十六进制格式公开页面信息。 此列已添加到 sys.dm_exec_requests
和 sys.sysprocesses
,且未来将根据需要添加到其他 DMV。
新函数 sys.fn_PageResCracker
将 page_resource
作为输入,并输出包含 database_id
、file_id
和 page_id
的的单行。 然后,可以使用此函数促进 sys.dm_exec_requests
或 sys.sysprocesses
与 sys.dm_db_page_info
之间的联接。
权限
需要数据库中的 VIEW DATABASE STATE
权限。
SQL Server 2022 及更高版本的权限
需要对数据库拥有 VIEW DATABASE PERFORMANCE STATE 权限。
示例
A. 显示页面的所有属性
以下查询返回一行,其中包含给定 database_id
、file_id
、page_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;