sys.dm_db_index_operational_stats(Transact-SQL)

適用対象:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceMicrosoft 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 }

データベースの ID です。 database_idsmallint です。 有効な入力は、データベースのID番号、 NULL0、または DEFAULTです。 既定値は 0 です。 NULL0、および DEFAULT は、このコンテキストで同等の値です。

SQL Server のインスタンス内のすべてのデータベースの情報を返す NULL を指定します。 NULLを指定する場合は、NULLindex_id、およびpartition_numberも指定する必要があります。

組み込み関数 DB_ID を指定できます。

{ object_id |NULL |0 | DEFAULT }

インデックスがオンになっているテーブルまたはビューのオブジェクト ID。 object_idint です。

有効な入力は、テーブルやビューのID番号、 NULL0、または DEFAULTです。 既定値は 0 です。 NULL0、および DEFAULT は、このコンテキストで同等の値です。

指定したデータベース内のすべてのテーブルとビューの情報を返す NULL を指定します。 NULLを指定する場合は、NULLpartition_numberも指定する必要があります。

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

インデックスの ID。 index_id知性です。有効な入力はインデックスのID番号であり0object_idがヒープ、NULL-1DEFAULTのいずれかです。 既定値は -1 です。 NULL-1、および DEFAULT は、このコンテキストで同等の値です。

ベース テーブルまたはビューのすべてのインデックスの情報を返す NULL を指定します。 NULLを指定する場合は、NULLも指定する必要があります。

{ partition_number |NULL |0 | DEFAULT }

オブジェクト内のパーティション番号を指定します。 partition_number は intです。有効な入力は、インデックスまたはヒープ、、または partition_number です。 既定値は 0 です。 NULL0、および DEFAULT は、このコンテキストで同等の値です。

インデックスまたはヒープのすべてのパーティションに関する情報を返す NULL を指定します。

partition_number は 1 から始まります。 パーティション分割されていないインデックスまたはヒープ partition_number 1 に設定されています。

返されるテーブル

列名 データの種類 Description
database_id smallint データベース ID。

Azure SQL Database では、値は 1 つのデータベースまたは Elastic Pool 内で一意ですが、論理サーバー内では一意ではありません。
object_id int テーブルまたはビューの ID。 詳細は sys.objectsをご覧ください。
index_id int インデックスまたはヒープの ID。 詳細は sys.indexesをご覧ください。
partition_number int インデックスまたはヒープ内の、1 から始まるパーティション番号。 詳細は sys.partitionsをご覧ください。
hobt_id bigint 列ストア インデックスの内部データを追跡するデータ ヒープまたは B ツリー行セットの ID。

NULL - これは内部のColumnstore行セットではありません。

詳細については、「 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 インデックスまたはヒープからの 1 行の取得の累積カウント。
forwarded_fetch_count bigint 前方向レコードを介してフェッチされた行の数。 ヒープにのみ適用されます。B ツリー インデックスの場合は 0 です。
lob_fetch_in_pages bigint LOB_DATAアロケーション ユニットから取得されたラージ オブジェクト (LOB) ページの累積カウント。 これらのページには、テキストntextimagevarchar(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 データと行オーバーフロー データの列値の累積カウント。 これは、更新操作によってレコード内の領域が解放され、 LOB_DATA または ROW_OVERFLOW_DATA の割り当て単位から 1 つ以上の行外の値を 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 上位レベルの B ツリー ページのみを含む page_latch_wait_count のサブセット。 ヒープまたは列ストア インデックスの場合は常に 0。
tree_page_latch_wait_in_ms bigint 上位レベルの B ツリー ページのみを含む page_latch_wait_in_ms のサブセット。 ヒープまたは列ストア インデックスの場合は常に 0。
tree_page_io_latch_wait_count bigint 上位レベルの B ツリー ページのみを含む page_io_latch_wait_count のサブセット。 ヒープまたは列ストア インデックスの場合は常に 0。
tree_page_io_latch_wait_in_ms bigint 上位レベルの B ツリー ページのみを含む page_io_latch_wait_in_ms のサブセット。 ヒープまたは列ストア インデックスの場合は常に 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_offrow および insert_over_ghost_version_offrowによってカウントされるバージョンを含むスーパーセットです。
ghost_version_inrow bigint 削除または更新 (削除後に挿入として実行) が、行内のバージョン情報を持つゴーストとして既存の行をマークした累積回数。 行内バージョンにはトランザクション タイムスタンプと長さ 0 のペイロードのみが格納されるため、削除を元に戻すには行のホストを解除するだけで済みます。
ghost_version_offrow bigint 削除または更新 (削除の後に挿入として実行) によって既存の行または LOB 列データが行外ストレージにプッシュされ、行にスタブが残ってバージョン管理情報が残された累積回数。 このカウンターは、ゴースト操作中に version_generated_offrow と共にインクリメントされます。
insert_over_ghost_version_inrow bigint B ツリーの過剰ゴースト挿入操作に対して生成されたペイロードを含む行内バージョンの累積カウント。 insert-over-ghost は、明示的な削除の後に挿入が続くか、削除として実装された更新またはマージから挿入された後に、以前にゴースト化されたレコードのスロットに新しい行が挿入されるときに発生します。 このカウンターは、 version_generated_inrowのサブセットです。
insert_over_ghost_version_offrow bigint B ツリーの過剰なゴースト挿入操作中に既存のゴースト行がオフ行ストレージにプッシュされ、新しく挿入された行にバージョン情報用のスタブが残された累積回数。 このカウンターは、 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 APPLY および OUTER 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_fetch_in_pages および lob_fetch_in_bytes の値は、含まれる列として 1 つ以上の LOB 列を含む非クラスター化インデックスの場合、0 より大きい値にすることができます。 詳細については、「 含まれる列を含むインデックスを作成する」を参照してください。 同様に、非クラスター化インデックスに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 ツリーのメタデータがメタデータ キャッシュに取り込まれるたびに、各数値列の値は 0 に設定されます。 統計は、キャッシュ オブジェクトがメタデータ キャッシュから削除されるまで累積されます。 アクティブなヒープまたは B ツリーには、通常、そのメタデータがキャッシュに含まれ、累積カウントには、データベース エンジン インスタンスが最後に開始されてからのアクティビティが反映されます。 あまり活発でないヒープやBツリーのメタデータは、特にデータベース エンジンインスタンスがメモリ負荷を受けている場合、使用中にキャッシュに出入りすることがあります。 その結果、インデックス操作の統計情報が sys.dm_db_index_operational_statsに反映されないことがあります。 これは一般的ではありません。

統計はキャッシュから削除され、テーブルまたはインデックスが削除された場合、またはパーティションが切り捨てられた場合、この関数によって報告されなくなります。 インデックスに対する他の DDL 操作により、統計の値が 0 にリセットされる可能性があります。

システム関数を使用してパラメーター値を指定する

Transact-SQL 関数の DB_IDOBJECT_ID を使用して、 database_id パラメーターと object_id パラメーターの値を指定できます。 しかし、これらの関数に無効な値を渡すと、意図しない結果が起こる可能性があります。 DB_IDまたはOBJECT_IDを使用する場合は、必ず有効な ID が返されることを確認してください。 詳細については、「 指定したテーブルの情報を返す」を参照してください。

Permissions

次のアクセス許可が必要です。

  • CONTROL データベース内の指定されたオブジェクトに対するアクセス許可

  • VIEW DATABASE STATE または、指定されたデータベース内のすべてのオブジェクトに関する情報を返す権限 VIEW DATABASE PERFORMANCE STATE@object_id の値が指定されていない場合に。

  • VIEW SERVER STATEまた、@database_idの価値が指定されていない場合、すべてのデータベースに関する情報を返す権限VIEW SERVER PERFORMANCE STATE

VIEW DATABASE STATEまたはVIEW SERVER PERFORMANCE STATEを付与すると、特定のオブジェクトに対して拒否されたCONTROL権限に関係なく、データベース内のすべてのオブジェクトを返すことができます。

VIEW DATABASE STATEまたはVIEW SERVER PERFORMANCE STATEを拒否すると、特定のオブジェクトに対して付与されたCONTROL権限に関係なく、データベース内のすべてのオブジェクトが返されなくなります。

詳細については、 システム動的管理のビューおよび機能をご覧ください。

Examples

指定したテーブルの情報を返します

以下の例は、AdventureWorks2025データベース内のすべての Person.Address テーブルのインデックスおよびパーティションの情報を返します。

Important

パラメータ値を返す際に Transact-SQL 関数 DB_IDOBJECT_ID を使う際は、必ず有効なIDが返されることを確認しましょう。 データベース名またはオブジェクト名が見つからない場合 (存在しない場合やスペルが正しくない場合など)、両方の関数は NULLを返します。 sys.dm_db_index_operational_stats関数は、すべてのデータベースまたはすべてのオブジェクトを指定するワイルドカード値としてNULLを解釈します。 これは、意図しない操作である可能性があるため、このセクションの例では、データベースおよびオブジェクト ID を確認する安全な方法を示します。

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;