sys.dm_exec_requests (Transact-SQL)

適用対象:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)

SQL Server で実行中の各要求に関する情報を返します。 要求の詳細については、「スレッドおよびタスクのアーキテクチャ ガイド」を参照してください。

注意

Azure Synapse Analytics または Analytics Platform System (PDW) 内の専用 SQL プールからこれを呼び出すには、「sys.dm_pdw_exec_requests (Transact-SQL)」を参照してください。 サーバーレス SQL プールの場合は、sys.dm_exec_requests を使用します。

列名 データ型 説明
session_id smallint 要求が関係しているセッションの ID。 NULL 値は許可されません。
request_id int 要求の ID。 セッションのコンテキスト内で一意です。 NULL 値は許可されません。
start_time datetime 要求到着時のタイムスタンプ。 NULL 値は許可されません。
status nvarchar(30) 要求の状態。 値は、次のいずれかです。

バックグラウンド
実行中
実行可能
休止中
Suspended
ロールバック

NULL 値は許可されません。
command nvarchar(32) 現在処理中のコマンドの種類。 一般的なコマンドの種類には次の値があります。

SELECT
INSERT
UPDATE
DELETE
BACKUP LOG
BACKUP DATABASE
DBCC
FOR

要求のテキストは、要求の対応するsql_handleと共に を使用 sys.dm_exec_sql_text して取得できます。 内部システム プロセスでは、実行するタスクの種類に基づいてコマンドが設定されます。 タスクには次のいずれかの値を含めることができます。

LOCK MONITOR
CHECKPOINTLAZY
WRITER

NULL 値は許可されません。
sql_handle varbinary(64) クエリが含まれているバッチまたはストアド プロシージャを一意に識別するトークンを指定します。 NULL 値は許可されます。
statement_start_offset int バッチまたは保存されるオブジェクトのテキスト内での、行が示すクエリの開始位置 (バイト単位)。0 で始まります。 sql_handlestatement_end_offsetsys.dm_exec_sql_text 動的管理関数と共に使用して、要求に対して現在実行中のステートメントを取得できます。 NULL 値は許可されます。
statement_end_offset int バッチまたは保存されるオブジェクトのテキスト内での、行が示すクエリの終了位置 (バイト単位)。0 で始まります。 sql_handlestatement_start_offsetsys.dm_exec_sql_text 動的管理関数と共に使用して、要求に対して現在実行中のステートメントを取得できます。 NULL 値は許可されます。
plan_handle varbinary(64) 現在実行中のバッチのクエリ実行プランを一意に識別するトークンです。 NULL 値は許可されます。
database_id smallint 要求の実行対象データベースの ID。 NULL 値は許可されません。
user_id int 要求を送信したユーザーの ID。 NULL 値は許可されません。
connection_id uniqueidentifier 要求を受信した接続の ID。 NULL 値は許可されます。
blocking_session_id smallint 要求をブロックしているセッションの ID。 この列が NULL または 0 の場合は、要求がブロックされていないか、ブロックしているセッションのセッション情報が使用または識別できません。 詳細については、「SQL Server のブロックの問題を理解して解決する」を参照してください。

-2 = ブロックしているリソースは、孤立した分散トランザクションが所有しています。

-3 = ブロックしているリソースは、遅延復旧トランザクションが所有しています。

-4 = 内部ラッチの状態遷移のため、ブロックしているラッチの所有者のセッション ID を現時点では特定できませんでした。

-5 = ブロック ラッチ所有者のセッション ID は、このラッチの種類 (SH ラッチなど) に対して追跡されていないため、決定できませんでした。

blocking_session_id -5 自体が、パフォーマンスの問題を示しているわけではありません。 -5 は、セッションが非同期アクションが完了するのを待機していることを示します。 -5 の導入前は、待機状態であるにもかかわらず、同じセッションで blocking_session_id 0 が表示されることがありました。

ワークロードによっては、blocking_session_id として -5 が観測されることは日常的である場合もあります。
wait_type nvarchar(60) 要求が現在ブロックされている場合の待機の種類。 NULL 値は許可されます。

待機の種類の詳細については、「sys.dm_os_wait_stats (Transact-SQL)」を参照してください。
wait_time int 要求が現在ブロックされている場合の現時点での待機時間 (ミリ秒単位)。 NULL 値は許可されません。
last_wait_type nvarchar(60) 要求がブロックされていた場合の最後の待機の種類。 NULL 値は許可されません。
wait_resource nvarchar (256) 要求が現在ブロックされている場合の現在待機中のリソース。 NULL 値は許可されません。
open_transaction_count int 要求に対して開いているトランザクションの数。 NULL 値は許可されません。
open_resultset_count int 要求に対して開いている結果セットの数。 NULL 値は許可されません。
transaction_id bigint 要求が実行されるトランザクションの ID。 NULL 値は許可されません。
context_info varbinary (128) セッションの CONTEXT_INFO 値。 NULL 値は許可されます。
percent_complete real 次のコマンドで完了した作業の割合。

ALTER INDEX REORGANIZE
ALTER DATABASE の AUTO_SHRINK オプション
BACKUP DATABASE
DBCC CHECKDB
DBCC CHECKFILEGROUP
DBCC CHECKTABLE
DBCC INDEXDEFRAG
DBCC SHRINKDATABASE
DBCC SHRINKFILE
RECOVERY
RESTORE DATABASE
ROLLBACK
TDE ENCRYPTION

NULL 値は許可されません。
estimated_completion_time bigint 内部でのみ使用されます。 NULL 値は許可されません。
cpu_time int 要求で使用される CPU 時間 (ミリ秒単位)。 NULL 値は許可されません。
total_elapsed_time int 要求を受信してから経過した総時間 (ミリ秒単位)。 NULL 値は許可されません。
scheduler_id int この要求のスケジュールを設定しているスケジューラの ID。 NULL 値は許可されます。
task_address varbinary(8) 要求に関連付けられたタスクに割り当てられるメモリ アドレス。 NULL 値は許可されます。
読み取り bigint 要求で実行された読み取りの数。 NULL 値は許可されません。
書き込み bigint 要求で実行された書き込みの数。 NULL 値は許可されません。
logical_reads bigint 要求で実行された論理読み取りの数。 NULL 値は許可されません。
text_size int 要求の TEXTSIZE 設定。 NULL 値は許可されません。
language nvarchar(128) 要求の言語設定。 NULL 値は許可されます。
date_format nvarchar(3) 要求の DATEFORMAT 設定。 NULL 値は許可されます。
date_first smallint 要求の DATEFIRST 設定。 NULL 値は許可されません。
quoted_identifier bit 1 = 要求に対して QUOTED_IDENTIFIER が ON です。 それ以外の場合は 0 が返されます。

NULL 値は許可されません。
arithabort bit 1 = 要求に対して ARITHABORT 設定が ON です。 それ以外の場合は 0 が返されます。

NULL 値は許可されません。
ansi_null_dflt_on bit 1 = 要求に対して ANSI_NULL_DFLT_ON 設定が ON です。 それ以外の場合は 0 が返されます。

NULL 値は許可されません。
ansi_defaults bit 1 = 要求に対して ANSI_DEFAULTS 設定が ON です。 それ以外の場合は 0 が返されます。

NULL 値は許可されません。
ansi_warnings bit 1 = 要求に対して ANSI_WARNINGS 設定が ON です。 それ以外の場合は 0 が返されます。

NULL 値は許可されません。
ansi_padding bit 1 = 要求に対して ANSI_PADDING 設定が ON です。

それ以外の場合は 0 が返されます。

NULL 値は許可されません。
ansi_nulls bit 1 = 要求に対して ANSI_NULLS 設定が ON です。 それ以外の場合は 0 が返されます。

NULL 値は許可されません。
concat_null_yields_null bit 1 = 要求に対して CONCAT_NULL_YIELDS_NULL 設定が ON です。 それ以外の場合は 0 が返されます。

NULL 値は許可されません。
transaction_isolation_level smallint この要求に対するトランザクションの作成に使用された分離レベル。 NULL 値は許可されません。
0 = Unspecified
1 = ReadUncomitted
2 = ReadCommitted
3 = Repeatable
4 = Serializable
5 = Snapshot
lock_timeout int 要求のロック タイムアウトまでの時間 (ミリ秒単位)。 NULL 値は許可されません。
deadlock_priority int 要求の DEADLOCK_PRIORITY 設定。 NULL 値は許可されません。
row_count bigint この要求によってクライアントに返された行の数。 NULL 値は許可されません。
prev_error int 要求の実行中に発生した最後のエラー。 NULL 値は許可されません。
nest_level int 要求で実行されているコードの現在の入れ子レベル。 NULL 値は許可されません。
granted_query_memory int 要求でのクエリの実行に割り当てられたページ数。 NULL 値は許可されません。
executing_managed_code bit 特定の要求で、ルーチン、データ型、トリガーなどの共通言語ランタイム オブジェクトが現在実行されているかどうかを示します。 共通言語ランタイム オブジェクトが共通言語ランタイム内から Transact-SQL を実行した場合でも、共通言語ランタイム オブジェクトがスタックにある間は、このパラメーターが必ず設定されます。 NULL 値は許可されません。
group_id int このクエリが属しているワークロード グループの ID。 NULL 値は許可されません。
query_hash binary(8) クエリで計算され、同様のロジックを持つクエリを識別するために使用される、バイナリのハッシュ値です。 クエリ ハッシュを使用して、リテラル値だけが異なるクエリの全体的なリソース使用率を決定できます。
query_plan_hash binary(8) クエリ実行プランで計算され、同様のクエリ実行プランを識別するために使用される、バイナリのハッシュ値です。 クエリ プラン ハッシュを使用して、同様の実行プランを持つクエリの累積コストを確認できます。
statement_sql_handle varbinary(64) 適用対象: SQL Server 2014 (12.x) 以降。

個々のクエリの SQL ハンドル。

データベースに対してクエリ ストアが有効になっていない場合、この列は NULL です。
statement_context_id bigint 適用対象: SQL Server 2014 (12.x) 以降。

省略可能な 外部キー 。sys.query_context_settings

データベースに対してクエリ ストアが有効になっていない場合、この列は NULL です。
dop int 適用対象: SQL Server 2016 (13.x) 以降。

クエリの並列化の次数。
parallel_worker_count int 適用対象: SQL Server 2016 (13.x) 以降。

これが並列クエリである場合の、予約済み並列ワーカーの数。
external_script_request_id uniqueidentifier 適用対象: SQL Server 2016 (13.x) 以降。

現在の要求に関連付けられている外部スクリプト要求 ID。
is_resumable bit 適用対象: SQL Server 2017 (14.x) 以降。

要求が再開可能なインデックス操作であるかどうかを示します。
page_resource binary(8) 適用対象: SQL Server 2019 (15.x)

wait_resource 列にページが含まれている場合の、ページ リソースの 8 バイト 16 進数表現。 詳細については、「sys.fn_PageResCracker」を参照してください。
page_server_reads bigint 適用対象: Azure SQL Database Hyperscale

要求で実行されたページ サーバー読み取りの数。 NULL 値は許可されません。

注釈

SQL Server の外部のコード (拡張ストアド プロシージャや分散クエリなど) を実行するには、スレッドを非プリエンプティブ スケジューラの制御外で実行する必要があります。 このとき、ワーカーはプリエンプティブ モードに切り替えられます。 この動的管理ビューによって返される時間値には、プリエンプティブ モードで費やされた時間は含まれません。

行モードで並列要求を実行すると、SQL Server によってワーカー スレッドが割り当てられ、割り当てられたタスクを実行するワーカー スレッドが調整されます。 この DMV では、要求に対してコーディネーター スレッドのみが表示されます。 列 readswriteslogical_reads および row_count は、コーディネーター スレッドに対して更新されません。 列 wait_typewait_timelast_wait_typewait_resource および granted_query_memory は、コーディネーター スレッドに対して更新されません。 詳細については、「スレッドおよびタスクのアーキテクチャ ガイド」を参照してください。

アクセス許可

ユーザーがサーバーに対する VIEW SERVER STATE 権限を所有している場合は、SQL Server のインスタンスで実行中のすべてのセッションが表示されます。それ以外の場合は、現在のセッションだけが表示されます。 VIEW SERVER STATE は Azure SQL Database では許可できないため、sys.dm_exec_requests は常に現在の接続に制限されます。

可用性グループのシナリオでは、セカンダリ レプリカが 読み取りインテントのみに設定されている場合、セカンダリへの接続では、 を追加 applicationintent=readonlyして、そのアプリケーションの意図を接続文字列パラメーターで指定する必要があります。 そうしないと、sys.dm_exec_requests のアクセス チェックは、VIEW SERVER STATE アクセス許可が存在する場合でも、可用性グループ内のデータベースに対して合格になりません。

SQL Server 2022 (16.x) 以降のバージョンでは、sys.dm_exec_requestsサーバーに対する VIEW SERVER PERFORMANCE STATE 権限が必要です。

A. 実行中のバッチのクエリ テキストを検索する

次の例では、sys.dm_exec_requests をクエリして目的のクエリを検索し、その sql_handle を出力結果からコピーします。

SELECT * FROM sys.dm_exec_requests;
GO

その後、ステートメント テキストを取得するために、コピーした sql_handle をシステム関数 sys.dm_exec_sql_text(sql_handle) と共に使用します。

SELECT * FROM sys.dm_exec_sql_text(< copied sql_handle >);
GO

B. 実行中のバッチが保持しているすべてのロックを検索する

次の例では、sys.dm_exec_requests をクエリして目的のバッチを検索し、その transaction_id を出力結果からコピーします。

SELECT * FROM sys.dm_exec_requests;
GO

その後、ロック情報を検索するために、コピーした transaction_id をシステム関数 sys.dm_tran_locks と共に使用します。

SELECT * FROM sys.dm_tran_locks
WHERE request_owner_type = N'TRANSACTION'
    AND request_owner_id = < copied transaction_id >;
GO

C. 現在ブロックされているすべての要求を検索する

次の例では、sys.dm_exec_requests をクエリしてブロックされた要求に関する情報を検索します。

SELECT session_id,
    status,
    blocking_session_id,
    wait_type,
    wait_time,
    wait_resource,
    transaction_id
FROM sys.dm_exec_requests
WHERE status = N'suspended';
GO

D. 既存の要求を CPU 別に並べ替える

SELECT
    [req].[session_id],
    [req].[start_time],
    [req].[cpu_time] AS [cpu_time_ms],
    OBJECT_NAME([ST].[objectid], [ST].[dbid]) AS [ObjectName],
    SUBSTRING(
        REPLACE(
            REPLACE(
                SUBSTRING(
                    [ST].[text], ([req].[statement_start_offset] / 2) + 1,
                    ((CASE [req].[statement_end_offset]
                            WHEN -1 THEN DATALENGTH([ST].[text])
                            ELSE [req].[statement_end_offset]
                        END - [req].[statement_start_offset]
                        ) / 2
                    ) + 1
                ), CHAR(10), ' '
            ), CHAR(13), ' '
        ), 1, 512
    ) AS [statement_text]
FROM
    [sys].[dm_exec_requests] AS [req]
    CROSS APPLY [sys].dm_exec_sql_text([req].[sql_handle]) AS [ST]
ORDER BY
    [req].[cpu_time] DESC;
GO

こちらもご覧ください

次の手順