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
資料庫的識別碼。 DatabaseId 是 smallint。 有效的輸入是資料庫的識別碼。 預設值為 NULL,不過傳送此參數的 NULL 值將會導致錯誤。
FileId | NULL | DEFAULT
檔案的 ID。 FileId 是 int。有效的輸入是 DatabaseId 所指定之資料庫中檔案的識別碼。 預設值為 NULL,不過傳送此參數的 NULL 值將會導致錯誤。
PageId | NULL | DEFAULT
頁面的識別碼。 PageId 是 int。有效的輸入是 FileId 所指定之檔案中頁面的識別碼。 預設值為 NULL,不過傳送此參數的 NULL 值將會導致錯誤。
Mode | NULL | DEFAULT
決定函式輸出中的詳細資料層級。 'LIMITED'
會傳回所有描述資料行的 NULL 值,'DETAILED' 會填入描述資料行。 DEFAULT
為 'LIMITED'
。
傳回的表格
資料行名稱 | 資料類型 | 描述 |
---|---|---|
database_id | int | 資料庫識別碼。 在 Azure SQL 資料庫中,這些值在單一資料庫或彈性集區內是唯一的,但在邏輯伺服器內則不是唯一的。 |
file_id | int | 檔案識別碼 |
page_id | int | 頁面識別碼 |
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 | 擁有頁面的物件識別碼 |
index_id | int | 索引的識別碼 (0 代表堆積資料頁面) |
partition_id | bigint | 資料分割的識別碼 |
alloc_unit_id | bigint | 配置單位的識別碼 |
is_encrypted | bit | 指出頁面是否已加密的位元 |
has_checksum | bit | 指出頁面是否有總和檢查碼值的位元 |
總和檢查碼 | int | 儲存用來偵測資料損毀的總和檢查碼值 |
is_iam_pg | bit | 指出頁面是否為 IAM 頁面的位元 |
is_mixed_ext | bit | 指出是否在混合範圍中配置的位元 |
has_ghost_records | bit | 指出頁面是否包含准刪除記錄的位元 准刪除的記錄是已標示要刪除但尚未移除的記錄。 |
has_version_records | bit | 指出頁面是否包含用於加速資料庫復原的版本記錄的位元 |
pfs_page_id | int | 對應 PFS 頁面的頁面識別碼 |
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 頁面的頁面識別碼 |
gam_status | bit | 指出是否在 GAM 中配置的位元 |
gam_status_desc | nvarchar(64) | GAM 狀態位元的描述 |
sgam_page_id | int | 對應 SGAM 頁面的頁面識別碼 |
sgam_status | bit | 指出是否在 SGAM 中配置的位元 |
sgam_status_desc | nvarchar(64) | SGAM 狀態位元的描述 |
diff_map_page_id | int | 對應差異點陣圖頁面的頁面識別碼 |
diff_status | bit | 指出差異狀態是否已變更的位元 |
diff_status_desc | nvarchar(64) | 差異狀態位元的描述 |
ml_map_page_id | int | 對應最小記錄點陣圖頁面的頁面識別碼 |
ml_status | bit | 指出頁面是否以最小方式記錄的位元 |
ml_status_desc | nvarchar(64) | 最小記錄狀態位元的描述 |
prev_page_file_id | smallint | 上一頁檔案識別碼 |
prev_page_page_id | int | 上一頁頁面識別碼 |
next_page_file_id | smallint | 下一頁檔案識別碼 |
next_page_page_id | int | 下一頁頁面識別碼 |
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 提供給 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. 搭配其他 DMV 使用 sys.dm_db_page_info
當資料列包含非 Null page_resource
時,下列查詢會根據 sys.dm_exec_requests
所公開的 wait_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;