sys.dm_db_index_operational_stats(Transact-SQL)

適用於:SQL ServerAzure SQL DatabaseAzure SQL 受控執行個體Microsoft Fabric 中的 SQL 資料庫

回傳資料庫中每個資料表或索引分割區的底層資料存取、鎖定與鎖存統計資料。

Transact-SQL 語法慣例

Syntax

sys.dm_db_index_operational_stats (
    { database_id | NULL | 0 | DEFAULT }
    , { object_id | NULL | 0 | DEFAULT }
    , { index_id | 0 | NULL | -1 | DEFAULT }
    , { partition_number | NULL | 0 | DEFAULT }
)

引數

{ database_id |NULL |0 | DEFAULT }

資料庫的標識碼。 database_id為 smallint。 有效的輸入是資料庫的 ID 編號、 NULL0DEFAULT。 預設值為 0NULL0DEFAULT 在此內容中是相等的值。

指定 NULL 以傳回 SQL Server 實例中所有資料庫的資訊。 如果您針對 database_id 指定,也必須針對NULLindex_idNULL指定 。

可以指定內建函數 DB_ID

{ object_id |NULL |0 | DEFAULT }

索引開啟之數據表或檢視表的物件標識碼。 object_id為 int

有效的輸入是資料表和視圖的 ID 編號、 NULL0DEFAULT。 預設值為 0NULL0DEFAULT 在此內容中是相等的值。

指定 NULL 以傳回指定資料庫中所有數據表和檢視的資訊。 如果您針對 object_id 指定,也必須針對 index_id 和 partition_number指定 。NULLNULL

{ index_id | 0 |NULL |-1 | DEFAULT }

索引的識別碼。 index_id智力。有效輸入為索引的 ID 編號, 0object_id 為堆積、 NULL-1DEFAULT。 預設值為 -1NULL-1DEFAULT 在此內容中是相等的值。

指定 NULL 以傳回基表或檢視表之所有索引的資訊。 如果您針對 index_id 指定NULL,也必須針對 partition_number指定 NULL

{ partition_number |NULL |0 | DEFAULT }

對象中的數據分割編號。 partition_numberint。有效的輸入是索引或堆積、NULL0DEFAULT。 預設值為 0NULL0DEFAULT 在此內容中是相等的值。

指定 NULL 回傳索引或堆積所有分割的資訊。

partition_number是以 1 為基礎。 非分割索引或堆積partition_number設定為 1。

傳回的資料表

欄位名稱 資料類型 Description
database_id smallint 資料庫識別碼。

在 Azure SQL 資料庫中,這些值在單一資料庫或彈性集區內是唯一的,但在邏輯伺服器內則不是唯一的。
object_id int 數據表或檢視表的標識碼。 欲了解更多資訊,請參閱 sys.objects
index_id int 索引或堆積的標識碼。 欲了解更多資訊,請參閱 sys.indexes
partition_number int 索引或堆積內的1個分割區編號。 更多資訊請參見 sys.partitions
hobt_id bigint 追蹤數據行存放區索引內部數據的數據堆積或 B 型樹狀結構數據列集識別碼。

NULL - 這不是內部欄位儲存的列集。

如需詳細資訊,請參閱 sys.internal_partitions
leaf_insert_count bigint 葉片水平插入物的累積數量。 欲了解更多指數層級資訊,請參閱 指數架構與設計指南
leaf_delete_count bigint 葉片層級刪除的累積數量。 leaf_delete_count 只有在刪除紀錄中沒有被標記為幽靈的紀錄才會被增加。 對於先被重影的刪除紀錄, leaf_ghost_count 則會以增量方式進行。
leaf_update_count bigint 葉片等級更新的累積統計。
leaf_ghost_count bigint 累積標示為刪除但尚未移除的葉子層級列數。 這個計數不包括那些立即刪除且未標記為幽靈的紀錄。 清理執行緒會在固定間隔移除幽靈列。 此值不包含因未完成快照交易而被保留的幽靈列。
nonleaf_insert_count bigint 在分葉層級上方的插入累計計數。 僅適用於 B 樹索引。 堆積或欄位儲存索引則為 0。
nonleaf_delete_count bigint 分葉層級上方的刪除累計計數。 僅適用於 B 樹索引。 堆積或欄位儲存索引則為 0。
nonleaf_update_count bigint 分葉層級以上更新的累計計數。 僅適用於 B 樹索引。 堆積或欄位儲存索引則為 0。
leaf_allocation_count bigint 索引或堆積中葉節點層頁面分配的累積數量。

針對索引,頁面配置會對應至頁面分割。
nonleaf_allocation_count bigint 分葉層級上方頁面分割所造成的頁面配置累計計數。 僅適用於 B 樹索引。 堆積或欄位儲存索引則為 0。
leaf_page_merge_count bigint 分葉層級的頁面合併累計計數。 欄位商店索引永遠是 0。
nonleaf_page_merge_count bigint 分葉層級上方的頁面合併累計計數。 僅適用於 B 樹索引。 堆積或欄位儲存索引則為 0。
range_scan_count bigint 從索引或堆積開始的範圍和數據表掃描累計計數。
singleton_lookup_count bigint 從索引或堆積擷取單一數據列的累計計數。
forwarded_fetch_count bigint 透過轉送記錄擷取的數據列計數。 僅適用於堆積,B 樹索引則為 0。
lob_fetch_in_pages bigint 從分配單元檢索 LOB_DATA 的大型物件(LOB)頁面累積數量。 這些頁面包含以 textntextimagevarchar(max)、nvarchar(max)、varbinary(max)、xmljson 的欄位儲存的資料。 如需更多資訊,請見 資料類型
lob_fetch_in_bytes bigint 擷取的LOB數據位元組累計計數。
lob_orphan_create_count bigint 針對大量作業建立的孤立LOB值的累計計數。 僅適用於堆積和 B 樹叢集索引,非叢集索引和欄位儲存索引則為 0。
lob_orphan_insert_count bigint 大量作業期間插入的孤立LOB值的累計計數。 僅適用於堆積和 B 樹叢集索引,非叢集索引和欄位儲存索引則為 0。
row_overflow_fetch_in_pages bigint 從分配單元檢索的 ROW_OVERFLOW_DATA 列溢位資料頁累積計數。

這些頁面包含以欄位varchar(n)、 、 nvarchar(n)varbinary(n)sql_variant大型列儲存的資料。
row_overflow_fetch_in_bytes bigint 擷取的數據列溢位數據位元組累計計數。
column_value_push_off_row_count bigint LOB 數據和數據列溢位數據的累計數據行值計數,該數據列會推送至非數據列,讓插入或更新的數據列符合頁面。
column_value_pull_in_row_count bigint 提取數據列內之 LOB 數據和數據列溢位數據的累計數據行值計數。 當更新操作釋放記錄空間,並提供從 or LOB_DATA 配置單元拉取一個或多個 off-row 值ROW_OVERFLOW_DATA到該IN_ROW_DATA配置單元的機會時,就會發生這種情況。
row_lock_count bigint 所要求的數據列鎖定累計數目。
row_lock_wait_count bigint 資料庫引擎 在數據列鎖定上等候的累計次數。
row_lock_wait_in_ms bigint 資料庫引擎 在數據列鎖定上等候的總毫秒數。
page_lock_count bigint 所要求的頁面鎖定累計數目。
page_lock_wait_count bigint 資料庫引擎 在頁面鎖定上等候的累計次數。
page_lock_wait_in_ms bigint 資料庫引擎 在頁面鎖定上等候的總毫秒數。
index_lock_promotion_attempt_count bigint 資料庫引擎 嘗試呈報鎖定的累計次數。
index_lock_promotion_count bigint 資料庫引擎 升級鎖定的累計次數。
page_latch_wait_count bigint 資料庫引擎等待取得鎖扣的累積次數。
page_latch_wait_in_ms bigint 資料庫引擎等待的累積毫秒數,以取得鎖存。
page_io_latch_wait_count bigint 資料庫引擎在頁面 I/O 鎖存上等待的累積次數。
page_io_latch_wait_in_ms bigint 資料庫引擎 在頁面 I/O 閂鎖上等候的累計毫秒數。
tree_page_latch_wait_count bigint 其中子集 page_latch_wait_count 僅包含較高層級的 B 樹頁面。 堆積或數據行存放區索引的一律為 0。
tree_page_latch_wait_in_ms bigint 其中子集 page_latch_wait_in_ms 僅包含較高層級的 B 樹頁面。 堆積或數據行存放區索引的一律為 0。
tree_page_io_latch_wait_count bigint 其中子集 page_io_latch_wait_count 僅包含較高層級的 B 樹頁面。 堆積或數據行存放區索引的一律為 0。
tree_page_io_latch_wait_in_ms bigint 其中子集 page_io_latch_wait_in_ms 僅包含較高層級的 B 樹頁面。 堆積或數據行存放區索引的一律為 0。
page_compression_attempt_count bigint 針對 PAGE 特定資料表、索引或索引視圖的特定分割區,評估過等級壓縮的頁面數量。 包含因無法大幅節省而未壓縮的頁面。 欄位商店索引永遠是 0。
page_compression_success_count bigint 針對表格、索引或索引檢視的特定分割區,使用 PAGE 壓縮壓縮的資料頁數。 欄位商店索引永遠是 0。
version_generated_inrow bigint 累積的列中版本數,且有效載荷在堆積或 B 樹中產生,用於更新、合併或插入幽靈操作。 內列版本會直接將舊的列映像(或差異)儲存在該列中,避免前往版本存儲。 此計數是一個超集合,包含以 insert_over_ghost_version_inrow為 的版本。 關於列內行與離線版本的更多資訊,請參見 持久版本儲存(PVS)所使用的空間
version_generated_offrow bigint 累積推送至離列儲存的版本數,用於堆積、B 樹或 LOB 的刪除、更新、合併或穿過幽靈插入操作。 當舊排影像無法保留在列中時,會產生離行版本。 此計數是一個超集合,包含由 ghost_version_offrowinsert_over_ghost_version_offrow計算的版本。
ghost_version_inrow bigint 累積的刪除或更新(先刪除後再插入)將現有列標記為幽靈,並顯示內列版本資訊。 內列版本只儲存交易時間戳和零長度的有效載荷,因此撤銷刪除只需取消該列主機即可。
ghost_version_offrow bigint 累積計算刪除或更新(先刪除後插入)將現有的列或 LOB 欄位資料推送到列外儲存,並在列中留下一個存根以提供版本資訊。 這個計數器會在幽靈行動期間一起 version_generated_offrow 增加。
insert_over_ghost_version_inrow bigint 為 B 樹插入過幽靈操作產生的內列有效載荷版本累積計數。 插入重靈是指在先前被重影記錄的欄位中插入新列,可能是從明確刪除後再插入,或是以刪除後再插入的方式實作的更新或合併。 此計數器是 的 version_generated_inrow子集。
insert_over_ghost_version_offrow bigint 累積計數:在 B 樹插入 over ghost 操作中,現有幽靈列被推入離列儲存的次數,並在新插入的列中留下存根以儲存版本管理資訊。 此計數器是 的 version_generated_offrow子集。
compaction_attempt_count bigint 指數自壓縮嘗試次數的累積統計。 欲了解更多資訊,請參閱自動索引壓縮(預覽)。
compaction_complete_count bigint 完成的指數自合成累積數量。
compaction_skip_count bigint 跳過的指數自合成的累積數量。 欲了解更多跳躍原因,請參見 「使用擴展事件監控壓縮統計資料」。
compaction_ineligible_count bigint 累積壓縮嘗試次數會被跳過,因為某頁不符合自動壓縮的資格。
compaction_failure_count bigint 累計失敗壓實嘗試次數。
compaction_row_move_count bigint 累積的列數會作為自動壓縮的一部分,從一頁移動到另一頁。
compaction_page_deallocation_count bigint 將所有列移至另一頁後,被釋放的累積頁面數。

Note

文件通常會使用「B 型樹狀結構」一詞來指稱索引。 在資料列存放區索引中,資料庫引擎會實作 B+ 樹狀結構。 這不適用於列存儲索引或記憶體最佳化資料表上的索引。 如需詳細資訊,請參閱 SQL Server 和 Azure SQL 索引架構和設計指南

備註

此函式不會回傳記憶體優化資料表上的索引資訊。 關於記憶體優化資料表上的索引資訊,請參見 sys.dm_db_xtp_index_stats

此函數不接受與 的CROSS APPLYOUTER APPLY相關參數。

你可以用來 sys.dm_db_index_operational_stats 追蹤資料的讀寫操作統計,以及鎖定、頁面鎖存和頁面 I/O 鎖存的統計數據,適用於資料表、索引或分割區。 你可以辨識出遇到重大活動或爭用的表格、索引和分割區。

統計數據在分割層級提供,且為可加性。 這表示你可以透過撰寫 T-SQL 的彙整查詢,取得索引層級或資料表層級的統計數據。 欲了解更多資訊,請參閱「 索引掃描與尋找所有表格 」範例。

要分析資料表、索引或分割區的讀寫操作統計,請使用以下欄位:

  • leaf_insert_count
  • leaf_delete_count
  • leaf_update_count
  • leaf_ghost_count
  • range_scan_count
  • singleton_lookup_count

要辨識鎖閂爭用,請使用以下欄位:

  • page_latch_wait_count
  • page_latch_wait_in_ms

要辨識鎖的爭用,請使用以下欄位:

  • row_lock_count
  • page_lock_count
  • row_lock_wait_in_ms
  • page_lock_wait_in_ms

要分析實體 I/O 統計,請使用以下欄位:

  • page_io_latch_wait_count
  • page_io_latch_wait_in_ms

專欄評論

對於包含一個或多個 LOB 欄位的非叢集索引,欄位 和 lob_fetch_in_pages 中的值lob_fetch_in_bytes可能大於零。 如需詳細資訊,請參閱 使用內含數據行建立索引。 同樣地,若索引包含row_overflow_fetch_in_pages,欄位 和 row_overflow_fetch_in_bytes 的值也可能大於 0,若非聚類索引中列數較大。

元資料快取中的計數器如何被重置

所回傳 sys.dm_db_index_operational_stats 的資料僅存在於代表堆積或 B 樹的元資料快取物件存在時。 這些資料並非持久的。 這表示你無法用這些計數器來確定索引是否被使用,或該索引最後使用的時間。 相反地,請使用 sys.dm_db_index_usage_stats

每當堆積或 B 樹的元資料被帶入元資料快取時,每個數值欄位的值都會設為零。 統計資料會持續累積,直到快取物件從元資料快取中移除。 活躍堆積或 B 樹通常會在快取中包含其元資料,累積計數反映自資料庫引擎實例上次啟動以來的活動。 較不活躍的堆積或 B 樹的中繼資料可能會隨著使用而在快取中進出,特別是當 資料庫引擎 實例承受記憶體壓力時。 因此,索引操作統計有時可能無法反映在 sys.dm_db_index_operational_stats中。 這並不常見。

統計資料會從快取中移除,且當資料表或索引被丟棄,或分割區被截斷時,此函式不再回報統計資料。 對索引進行其他 DDL 操作可能會導致統計值被重置為零。

使用系統函式來指定參數值

您可以使用 Transact-SQL 函式DB_IDOBJECT_ID來指定database_idobject_id參數的值。 然而,將不有效的值傳入這些函式可能會造成意想不到的結果。 請務必確定當您使用 DB_IDOBJECT_ID時,會傳回有效的標識符。 欲了解更多資訊,請參閱 指定表格的回傳資訊

許可

需要下列權限:

  • CONTROL 資料庫內指定對象的許可權

  • VIEW DATABASE STATEVIEW DATABASE PERFORMANCE STATE 在未指定 的 @object_id 值時,允許回傳指定資料庫中所有物件的資訊。

  • VIEW SERVER STATEVIEW SERVER PERFORMANCE STATE 在未指定 的 @database_id 值時,允許回傳所有資料庫的資訊。

VIEW DATABASE STATE VIEW SERVER PERFORMANCE STATE允許或允許資料庫中的所有物件回傳,不論特定物件是否CONTROL被拒絕權限。

拒絕 VIEW DATABASE STATEVIEW SERVER PERFORMANCE STATE 不允許資料庫中所有物件回傳,不論對特定物件是否 CONTROL 獲得權限。

欲了解更多資訊,請參閱 系統動態管理檢視與功能

Examples

指定資料表的回傳資訊

以下範例回傳 AdventureWorks2025 資料庫中所有索引與分割 Person.Address 的資訊。

Important

當你使用 Transact-SQL 函式 DB_IDOBJECT_ID 回傳參數值時,務必確保回傳的 ID 是有效的。 如果找不到資料庫或物件名稱,例如不存在或拼字不正確時,這兩個函式都會傳回 NULL。 函 sys.dm_db_index_operational_stats 式會 NULL 解譯為通配符值,指定所有資料庫或所有物件。 由於這不見得是刻意安排的作業,因此本節所舉的範例,只會示範決定資料庫和物件識別碼的安全方法。

DECLARE @db_id AS INT = DB_ID(N'AdventureWorks2025');
DECLARE @object_id AS INT = OBJECT_ID(N'AdventureWorks2025.Person.Address');

SELECT *
FROM sys.dm_db_index_operational_stats(@db_id, @object_id, NULL, NULL)
WHERE @db_id IS NOT NULL
      AND @object_id IS NOT NULL;

所有表格與索引的回傳資訊

以下範例回傳資料庫引擎實例中所有資料表與索引的資訊。

SELECT *
FROM sys.dm_db_index_operational_stats(NULL, NULL, NULL, NULL);

索引掃描與尋道涵蓋所有表格

以下範例彙整分割層級資料,以回傳索引搜尋與掃描統計資料,涵蓋目前資料庫中所有資料表。

SELECT OBJECT_SCHEMA_NAME(object_id) AS schema_name,
       OBJECT_NAME(object_id) AS object_name,
       COUNT(DISTINCT(index_id)) AS index_count,
       COUNT(DISTINCT(partition_number)) AS partition_count,
       SUM(range_scan_count) AS index_scan_count,
       SUM(singleton_lookup_count) AS index_seek_count
FROM sys.dm_db_index_operational_stats(DB_ID(), DEFAULT, DEFAULT, DEFAULT)
GROUP BY OBJECT_SCHEMA_NAME(object_id),
         OBJECT_NAME(object_id)
ORDER BY schema_name, object_name;