「Microsoft SQL Server」が稼働するデータベースシステムを運用する管理者に向け、「動的管理ビュー」の活用を軸にしたトラブル対策のためのノウハウを紹介していきます。今回は、リアルタイムでクエリの進行状況を出力する方法について解説します。
この記事は会員限定です。会員登録(無料)すると全てご覧いただけます。
本連載では、「Microsoft SQL Server(以下、SQL Server)」で使用可能な動的管理ビューについて、動作概要や出力内容などを紹介していきます。今回は動的管理ビュー「sys.dm_exec_query_profiles」における、リアルタイムでクエリの進行状況を出力する方法について解説します。対応バージョンは、SQL Server(サポートされている全てのバージョン)です。
SQL Server 2016のSQL Server Management Studioから、ライブクエリ統計機能によりリアルタイムでクエリの進行情報を確認できるようになりました。ライブクエリ統計の機能では、経過時間や進捗(しんちょく)状況などの全体的なクエリの状態と、実行プランのオペレーターレベルでの実行統計を、クエリの完了を待つことなくリアルタイムの情報として表示できます。
「sys.dm_exec_query_profiles」動的管理ビューを使用することで、ライブクエリ統計と同様に、オペレーターレベルでの実行統計をリアルタイムに出力できます。そのため、「sys.dm_exec_query_profiles」動的管理ビューを繰り返し出力しておくことで、後から実行時間の長いクエリやタイムアウトの問題をデバッグすることができます。
なお、「sys.dm_exec_query_profiles」動的管理ビューを使用してクエリの実行統計を出力するには、出力対象のクエリを実行するセッションで、クエリ実行統計プロファイリングインフラストラクチャが有効となっている必要があります。
SQL Server 2019では、既定で軽量クエリ実行統計プロファイリングインフラストラクチャv3が有効化されていますが、SQL Server 2017以前のバージョンでは「SET STATISTICS XML」や「SET STATISTICS PROFILE」、トレースフラグ「7412」などを使用して、クエリ実行統計プロファイリングインフラストラクチャを有効化する必要があります。
列名 | データ型 | 説明 |
---|---|---|
session_id | smallint | クエリが実行されるセッションID |
request_id | int | 要求を識別するリスエストID |
sql_handle | varbinary(64) | クエリが含まれているバッチまたはストアドプロシージャを一意に識別する識別子 |
plan_handle | varbinary(64) | 実行中の実行プランを一意に識別する識別子 |
physical_operator_name | nvarchar(256) | 物理オペレーター名 |
node_id | int | クエリツリー内のオペレーターノードの識別子 |
thread_id | int | 同じクエリオペレーターノードに属するスレッド(並列クエリの場合)の識別子 |
task_address | varbinary(8) | このスレッドが使用しているSQLOSタスクの識別子 |
row_count | bigint | これまでにオペレーターによって返された行の数 |
rewind_count | bigint | これまでの巻き戻しの数 |
rebind_count | bigint | これまでの再バインドの数 |
end_of_scan_count | bigint | これまでのスキャンの終了数 |
estimate_row_count | bigint | 推定行数 |
first_active_time | bigint | オペレーターが最初に呼び出されたときの時刻(ミリ秒単位) |
last_active_time | bigint | オペレーターが最後に呼び出された時刻(ミリ秒単位) |
open_time | bigint | オープン時のタイムスタンプ(ミリ秒単位) |
first_row_time | bigint | 最初の行をオープンしたときのタイムスタンプ(ミリ秒単位) |
last_row_time | bigint | 最後の行をクローズしたときのタイムスタンプ(ミリ秒単位) |
close_time | bigint | クローズ時のタイムスタンプ(ミリ秒単位) |
elapsed_time_ms | bigint | これまでの対象ノードの操作で使用された経過時間の合計(ミリ秒単位) |
cpu_time_ms | bigint | これまでの対象ノードの操作で使用された合計CPU時間(ミリ秒) |
database_id | smallint | 読み取りおよび書き込みが実行されたオブジェクトのデータベースのID |
object_id | int | 読み取りおよび書き込みが実行されたオブジェクトID |
index_id | int | 行セットをオープンする際のインデックスID(存在する場合) |
scan_count | bigint | これまでのテーブル/インデックススキャンの数 |
logical_read_count | bigint | これまでの論理読み取りの数 |
physical_read_count | bigint | これまでの物理読み取りの数 |
read_ahead_count | bigint | これまでの先行読み取りの数 |
write_page_count | bigint | これまでのページ書き込みの数 |
lob_logical_read_count | bigint | これまでの論理読み取りLOB数 |
lob_physical_read_count | bigint | これまでの物理読み取りLOB数 |
lob_read_ahead_count | bigint | これまでの先行読み取りLOB数 |
segment_read_count | int | これまでの先行読み取りされたセグメント数 |
segment_skip_count | int | これまでにスキップされたセグメント数 |
actual_read_row_count | bigint | 残余述語が適用される前にオペレーターによって読み取られた行の数 |
estimated_read_row_count | bigint | 残余述語が適用される前にオペレーターによって読み取られると推定される行の数 適用対象:SQL Server 2016 SP1以降 |
Copyright © ITmedia, Inc. All Rights Reserved.