sys.dm_db_index_operational_stats (Transact-SQL)
適用対象:SQL Server
Azure SQL Database
Azure SQL Managed Instance
データベース内のテーブルまたはインデックスの各パーティションの現在の下位レベルの I/O、ロック、ラッチ、およびアクセス方法のアクティビティを返します。
メモリ最適化インデックスは、この DMV には表示されません。
注意
sys.dm_db_index_operational_stats は、メモリ最適化インデックスに関する情報を返しません。 メモリ最適化インデックスの使用の詳細については、「 sys.dm_db_xtp_index_stats (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_id は smallint です。 有効な入力値は、データベースの 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_id は int です。
有効な入力値は、テーブルおよびビューの ID 番号、NULL、0、または DEFAULT です。 既定値は 0 です。 このコンテキストでは、NULL、0、および DEFAULT は同じ値になります。
NULL を指定すると、指定されたデータベース内にあるすべてのテーブルとビューに関するキャッシュされた情報が返されます。 object_idに NULL を指定する場合は、index_idとpartition_numberにも NULL を指定する必要があります。
index_id |0 |NULL |-1 |既定
インデックスの ID。 index_id は int です。有効な入力はインデックスの ID 番号です。 object_id がヒープ、NULL、-1、または DEFAULT の場合は 0 です。 既定値は -1 です。このコンテキストでは、NULL、-1、および DEFAULT は同じ値になります。
NULL を指定すると、ベース テーブルまたはビューのすべてのインデックスに関するキャッシュされた情報が返されます。 index_idに NULL を指定する場合は、partition_numberに NULL も指定する必要があります。
partition_number |NULL |0 |既定
オブジェクト内のパーティション番号を指定します。 partition_number は int です。有効な入力は、インデックスまたはヒープ、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 | 適用対象: 列ストア インデックスの内部データを追跡するデータ ヒープまたは 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) ページの累積数。 これらのページには、text、ntext、image、varchar(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 STATE
VIEW 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)
フィードバック
フィードバックの送信と表示