sys.dm_db_index_operational_stats (Transact-SQL)

適用対象:SQL ServerAzure SQL DatabaseAzure SQL Managed Instance

データベース内のテーブルまたはインデックスの各パーティションの現在の下位レベルの I/O、ロック、ラッチ、およびアクセス方法のアクティビティを返します。

メモリ最適化インデックスは、この DMV には表示されません。

注意

sys.dm_db_index_operational_stats は、メモリ最適化インデックスに関する情報を返しません。 メモリ最適化インデックスの使用の詳細については、「 sys.dm_db_xtp_index_stats (Transact-SQL)」を参照してください。

Transact-SQL 構文表記規則

構文

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 |既定

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

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

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

object_id |NULL |0 |既定

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

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

NULL を指定すると、指定されたデータベース内にあるすべてのテーブルとビューに関するキャッシュされた情報が返されます。 object_idに NULL を指定する場合は、index_idpartition_numberにも NULL を指定する必要があります。

index_id |0 |NULL |-1 |既定

インデックスの ID。 index_idint です。有効な入力はインデックスの ID 番号です。 object_id がヒープ、NULL、-1、または DEFAULT の場合は 0 です。 既定値は -1 です。このコンテキストでは、NULL、-1、および DEFAULT は同じ値になります。

NULL を指定すると、ベース テーブルまたはビューのすべてのインデックスに関するキャッシュされた情報が返されます。 index_idに NULL を指定する場合は、partition_numberに NULL も指定する必要があります。

partition_number |NULL |0 |既定

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

NULL を指定すると、インデックスまたはヒープのすべてのパーティションについてキャッシュされた情報が返されます。

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

返されるテーブル

列名 データ型 説明
database_id smallint データベース ID。

Azure SQL Database では、値は 1 つのデータベースまたはエラスティック プール内で一意ですが、論理サーバー内では一意ではありません。
object_id int テーブルまたはビューの ID。
index_id int インデックスまたはヒープの ID。

0 = ヒープ
partition_number int インデックスまたはヒープ内の、1 から始まるパーティション番号。
hobt_id bigint 適用対象:2016 (13.x) 以降のバージョンSQL Server、データベースAzure SQL。

列ストア インデックスの内部データを追跡するデータ ヒープまたは B ツリー行セットの ID。

NULL - これは内部列ストア行セットではありません。

詳細については、「sys.internal_partitions (Transact-SQL)」を参照してください。
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 リーフ レベルより上の挿入の累積数。

0 = ヒープまたは列ストア
nonleaf_delete_count bigint リーフ レベルより上の削除の累積数。

0 = ヒープまたは列ストア
nonleaf_update_count bigint リーフ レベルより上の更新の累積数。

0 = ヒープまたは列ストア
leaf_allocation_count bigint インデックスまたはヒープにおけるリーフ レベルのページ割り当ての累積数。

インデックスの場合、ページ割り当てとページ分割は対応しています。
nonleaf_allocation_count bigint リーフ レベルより上のページ分割によって発生したページ割り当ての累積数。

0 = ヒープまたは列ストア
leaf_page_merge_count bigint リーフ レベルでページをマージした累積数。 列ストア インデックスの場合は常に 0。
nonleaf_page_merge_count bigint リーフ レベルより上でページをマージした累積数。

0 = ヒープまたは列ストア
range_scan_count bigint インデックスまたはヒープで開始された範囲スキャンとテーブル スキャンの累積数。
singleton_lookup_count bigint インデックスまたはヒープから取得した単一行の累積数。
forwarded_fetch_count bigint 前方向レコードを介してフェッチされた行の数。

0 = インデックス
lob_fetch_in_pages bigint LOB_DATA アロケーション ユニットから取得したラージ オブジェクト (LOB) ページの累積数。 これらのページには、textntextimagevarchar(max)、nvarchar(max)varbinary(max)および xml 型の列に格納されているデータが含まれています。 詳細については、「 データ型 (Transact-SQL)」を参照してください。
lob_fetch_in_bytes bigint 取得した LOB データの累積バイト数。
lob_orphan_create_count bigint 一括操作用に作成された、孤立した LOB 値の累積数。

0 = 非クラスター化インデックス
lob_orphan_insert_count bigint 一括操作中に挿入された、孤立した LOB 値の累積数。

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 アロケーション ユニットから IN_ROW_DATA アロケーション ユニットに 1 つ以上の行外値を取り込めるようになったときに発生します。
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 テーブル、インデックス、またはインデックス付きビューの特定のパーティションで、ページ レベルの圧縮が評価されたページの数。 大幅な節減を実現できないため圧縮されなかったページも含まれます。 列ストア インデックスの場合は常に 0。
page_compression_success_count bigint テーブル、インデックス、またはインデックス付きビューの特定のパーティションで、ページの圧縮を使用して圧縮されたデータ ページの数。 列ストア インデックスの場合は常に 0。

Note

SQL Server のドキュメントでは、一般にインデックスに関して B ツリーという用語が使用されます。 行ストア インデックスで、SQL Server によって B+ ツリーが実装されます。 これは、列ストア インデックスやメモリ内データ ストアには適用されません。 詳細については、「SQL Server と Azure SQL のインデックスのアーキテクチャとデザイン ガイド」を参照してください。

注釈

この動的管理オブジェクトでは、 および OUTER APPLYからのCROSS APPLY相関パラメーターは受け入れられません。

sys.dm_db_index_operational_stats を使用すると、テーブル、インデックス、またはパーティションに対する読み書きを行うために、ユーザーが待機する必要がある時間の長さを追跡でき、重大な I/O 動作やホット スポットが発生したテーブルまたはインデックスを特定できます。

競合について確認するには、次の列を使用します。

テーブルまたはインデックス パーティションへの一般的なアクセス パターンを分析する場合、次の列を使用します。

  • 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

    これらの列では、インデックスまたはヒープ ページをメモリ内に移動するために、物理 I/O が発行されたかどうかが示されます。また I/O の発行回数も示されます。

列の解説

lob_orphan_create_count および lob_orphan_insert_count 内の値は、常に同じになります。

付加列として 1 つ以上の LOB 列を含む非クラスター化インデックスの場合、lob_fetch_in_pages および lob_fetch_in_bytes 列内の値は 0 より大きくなります。 詳細については、「 付加列インデックスの作成」を参照してください。 同様に、行外に出される可能性がある列を含む非クラスター化インデックスの場合は、row_overflow_fetch_in_pages および row_overflow_fetch_in_bytes 列内の値は 0 より大きくなります。

メタデータ キャッシュ内のカウンターのリセット方法

sys.dm_db_index_operational_stats により返されるデータが存在するのは、ヒープまたはインデックスを表すメタデータ キャッシュ オブジェクトが使用できる間だけです。 このデータは持続性はなく、トランザクション上の一貫性もありません。 つまり、これらのカウンターを使って、インデックスが使用されているかどうかや、インデックスが最後に使用されたのはいつであるかを判断することはできません。 詳細については、「 sys.dm_db_index_usage_stats (Transact-SQL)」を参照してください。

ヒープまたはインデックスに対するメタデータがメタデータ キャッシュに組み込まれるたび、各列の値はゼロに設定されます。統計値は、キャッシュ オブジェクトがメタデータ キャッシュから削除されるまで累積されます。 したがって、アクティブヒープまたはインデックスは常にキャッシュ内にメタデータを持ち、SQL Serverのインスタンスが最後に開始されてからのアクティビティが累積カウントに反映される可能性があります。 アクティブになる頻度が低いヒープやインデックスのメタデータは、使用状況に応じてキャッシュ内外に移動されます。 その結果、使用できる値が存在する場合と、存在しない場合が発生します。 インデックスを削除すると、対応する統計はメモリから削除され、この関数ではレポートされなくなります。 インデックスに対するその他の DDL 操作によって、統計の値がゼロにリセットされる場合もあります。

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

Transact-SQL 関数 のDB_ID とOBJECT_IDを使用して、 database_id パラメーターと object_id パラメーターの値 指定できます。 ただし、これらの関数に無効な値を渡すと、意図しない結果が生じる可能性があります。 DB_ID または OBJECT_ID を使用する場合は、必ず有効な ID が返されるようにしてください。 詳細については、「 sys.dm_db_index_physical_stats (Transact-SQL)」の「解説」セクションを参照してください。

アクセス許可

次の権限が必要です。

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

  • VIEW DATABASE STATEまたは VIEW DATABASE PERFORMANCE STATE (SQL Server 2022) オブジェクト ワイルドカード @object_id = NULL を使用して、指定されたデータベース内のすべてのオブジェクトに関する情報を返すアクセス許可

  • VIEW SERVER STATEVIEW SERVER PERFORMANCE STATE(SQL Server 2022) データベース ワイルドカード @database_id = NULL を使用して、すべてのデータベースに関する情報を返すアクセス許可

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

を拒否すると VIEW DATABASE STATE 、特定のオブジェクトに対して付与された CONTROL 権限に関係なく、データベース内のすべてのオブジェクトが返されなくなります。 また、データベース @database_id=NULL ワイルドカードを指定すると、データベースは省略されます。

詳細については、「 動的管理ビューと関数 (Transact-SQL)」を参照してください。

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

次の例では、AdventureWorks2022 データベース内の Person.Address テーブルのすべてのインデックスとパーティションの情報を返します。 このクエリを実行するには、少なくとも Person.Address テーブルに対する CONTROL 権限が必要です。

重要

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

DECLARE @db_id int;    
DECLARE @object_id int;    
SET @db_id = DB_ID(N'AdventureWorks2022');    
SET @object_id = OBJECT_ID(N'AdventureWorks2022.Person.Address');    
IF @db_id IS NULL     
  BEGIN;    
    PRINT N'Invalid database';    
  END;    
ELSE IF @object_id IS NULL    
  BEGIN;    
    PRINT N'Invalid object';    
  END;    
ELSE    
  BEGIN;    
    SELECT * FROM sys.dm_db_index_operational_stats(@db_id, @object_id, NULL, NULL);    
  END;    
GO    

B. すべてのテーブルとインデックスの情報を返す

次の例では、SQL Server のインスタンス内のすべてのテーブルとインデックスの情報を返します。 このクエリを実行するには、VIEW SERVER STATE 権限が必要です。

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

参照

動的管理ビューと動的管理関数 (Transact-SQL)
インデックス関連の動的管理ビューおよび関数 (Transact-SQL)
パフォーマンスの監視とチューニング
sys.dm_db_index_physical_stats (Transact-SQL)
sys.dm_db_index_usage_stats (Transact-SQL)
sys.dm_os_latch_stats (Transact-SQL)
sys.dm_db_partition_stats (Transact-SQL)
sys.allocation_units (Transact-SQL)
sys.indexes (Transact-SQL)