sys.dm_db_index_operational_stats (Transact-SQL)

適用対象: はいSQL Server (サポートされているすべてのバージョン) はいAzure SQL データベース はいAzure SQL Managed Instance

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

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

注意

sys.dm_db_index_operational_stats メモリ最適化インデックスに関する情報は返されません。 メモリ最適化インデックスの使用については、「Transact-sys.dm_db_xtp_index_stats (」を参照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 を指定します。 に NULL を指定する database_id、 および の各値に NULL object_id指定 index_id 必要**partition_number。

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

object_id| NULL |0 |既定

インデックスがあるテーブルまたはビューのオブジェクト ID を指定します。 object_idint です

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

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

index_id| 0 |NULL |-1 |既定

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

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

partition_number| NULL |0 |既定

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

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

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

返されるテーブル

列名 データ型 説明
database_id smallint データベース ID。
object_id int テーブルまたはビューの ID。
index_id int インデックスまたはヒープの ID。

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

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

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

詳細については、「Transact-sys.internal_partitions (」を参照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 です。

解説

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

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

システム関数を使用したパラメーター値の指定

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

アクセス許可

次の権限が必要です。

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

  • VIEW DATABASE STATE 指定したデータベース内のすべてのオブジェクトに関する情報を返す権限。オブジェクトのワイルドカード @object_id = NULL

  • VIEW SERVER STATEデータベースのワイルドカード @ を使用してすべてのデータベースに関する情報を返す権限 = NULL database_id。

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

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

詳細については、「Dynamic Management Views and Functions (Transact-SQL)」を参照してください

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

次の例では、AdventureWorks2012 データベース内にある 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'AdventureWorks2012');    
SET @object_id = OBJECT_ID(N'AdventureWorks2012.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)