适用于: 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;