sys.dm_os_workers (Transact-SQL)

適用対象: SQL Server Azure SQL データベース Azure SQL Managed Instance Azure Synapse Analytics Analytics Platform System (PDW)

システム内のすべての worker の行を返します。 Worker の詳細については、「スレッドおよびタスクのアーキテクチャ ガイド」を参照してください。

Note

Azure Synapse Analytics または Analytics Platform System (PDW) からこれを呼び出すには、sys.dm_pdw_nodes_os_workers という名前を使用します。 この構文は、Azure Synapse Analytics のサーバーレス SQL プールでサポートされていません。

列名 データ型 説明
worker_address varbinary(8) Worker のメモリ アドレス。
status int 内部のみで使用します。
is_preemptive bit 1 = ワーカーは、プリエンプティブなスケジュール設定で実行中です。 外部コードを実行している worker は、プリエンプティブ スケジューリングで実行されます。
is_fiber bit 1 = Worker は軽量プールで実行されています。 詳細については、「sp_configure (Transact-SQL)」を参照してください。
is_sick bit 1 = ワーカーは、スピン ロックを取得しようとして停止しています。 このビットが設定されている場合は、頻繁にアクセスされるオブジェクトの競合に問題があることを示している可能性があります。
is_in_cc_exception bit 1 = Worker は現在、SQL Server 以外の例外を処理しています。
is_fatal_exception bit この worker が致命的な例外を受け取ったかどうかを指定します。
is_inside_catch bit 1 = Worker は現在、例外を処理しています。
is_in_polling_io_completion_routine bit 1 = Worker は現在、保留中の I/O に対して I/O 完了ルーチンを実行中です。 詳細については、「sys.dm_io_pending_io_requests (Transact-SQL)」を参照してください。
context_switch_count int この worker によって実行されるスケジューラ コンテキスト スイッチの数。
pending_io_count int ワーカーによって実行された物理 I/O の数。
pending_io_byte_count bigint この worker のすべての物理 I/O の合計バイト数。
pending_io_byte_average int ワーカーの物理 I/O の平均バイト数。
wait_started_ms_ticks bigint この worker の状態が SUSPENDED になった時点 (ms_ticks)。 この値を sys.dm_os_sys_info で ms_ticks から減算すると、worker が待機している時間がミリ秒単位で返されます。
wait_resumed_ms_ticks bigint この worker の状態が RUNNABLE になった時点 (ms_ticks)。 この値を sys.dm_os_sys_info の ms_ticks から減算すると、worker が実行可能キューで待機している時間がミリ秒単位で返されます。
task_bound_ms_ticks bigint タスクがこの worker にバインドされた時点 (ms_ticks)。
worker_created_ms_ticks bigint Worker が作成された時点 (ms_ticks)。
exception_num int ワーカーで前回発生した例外のエラー番号。
exception_severity int ワーカーで前回発生した例外の重大度。
exception_address varbinary(8) 例外をスローしたコード アドレス。
アフィニティ bigint ワーカーのスレッド関係。 sys.dm_os_threads (Transact-SQL) のスレッドの関係と一致します。
nvarchar(60) Worker の状態。 値は、次のいずれかです。

INIT = Worker は現在初期化中です。

RUNNING = ワーカーは、現在非プリエンプティブまたはプリエンプティブのいずれかで実行中です。

RUNNABLE = ワーカーは、スケジューラ上で実行できる状態です。

SUSPENDED = ワーカーは現在中断されています。イベントによるシグナル送信を待機中です。
start_quantum bigint ワーカーの現在の実行が開始された時間 (ミリ秒単位)。
end_quantum bigint この worker の現在の実行が終了する時間 (ミリ秒単位)。
last_wait_type nvarchar(60) 最後の待機の種類。 待機の種類の一覧については、「sys.dm_os_wait_stats (Transact-SQL)」を参照してください。
return_code int 最後の待機からの戻り値。 値は、次のいずれかです。

0 =SUCCESS

3 = DEADLOCK

4 = PREMATURE_WAKEUP

258 = TIMEOUT
quantum_used bigint 内部のみで使用します。
max_quantum bigint 内部のみで使用します。
boost_count int 内部のみで使用します。
tasks_processed_count int この worker が処理したタスクの数。
fiber_address varbinary(8) ワーカーが関連付けられているファイバーのメモリ アドレス。

NULL = SQL Server は、軽量プーリング用に構成されていません。
task_address varbinary(8) 現在のタスクのメモリ アドレス。 詳細については、「sys.dm_os_tasks (Transact-SQL)」を参照してください。
memory_object_address varbinary(8) ワーカーのメモリ オブジェクトのメモリ アドレス。 詳細については、「sys.dm_os_memory_objects (Transact-SQL)」を参照してください。
thread_address varbinary(8) この worker に関連付けられているスレッドのメモリ アドレス。 詳細については、「sys.dm_os_threads (Transact-SQL)」を参照してください。
signal_worker_address varbinary(8) このオブジェクトを最後に通知した worker のメモリ アドレス。 詳細については、「sys.dm_os_workers」を参照してください。
scheduler_address varbinary(8) スケジューラのメモリ アドレス。 詳細については、「sys.dm_os_schedulers (Transact-SQL)」を参照してください。
processor_group smallint このスレッドに割り当てられているプロセッサ グループ ID が格納されます。
pdw_node_id int 適用対象: Azure Synapse Analytics、Analytics Platform System (PDW)

このディストリビューションがオンになっているノードの識別子。

解説

ワーカーの状態が RUNNING で、非プリエンプティブに実行されている場合、そのワーカーのアドレスは、sys.dm_os_schedulers 内の active_worker_address と一致します。

イベントで待機中のワーカーがシグナルを受け取ると、そのワーカーは実行可能キューの先頭に置かれます。 SQL Server でこれが 1,000 回続けて発生すると、worker はキューの末尾に置かれます。 ワーカーがキューの末尾に移動すると、パフォーマンスに影響が生じる場合があります。

アクセス許可

SQL Server では、VIEW SERVER STATE 権限が必要です。
SQL Database Premium 階層では、データベースで VIEW DATABASE STATE 権限が必要です。 SQL Database Standard レベルと Basic レベルでは、Server Admin ロール メンバーシップ、または Azure Active Directory admin アカウントが必要です。

SQL Server 2022 以降でのアクセス許可

サーバーに対する VIEW SERVER PERFORMANCE STATE アクセス許可が必要です。

次のクエリを使用すると、SUSPENDED または RUNNABLE 状態でのワーカーの実行時間を調べることができます。

SELECT   
    t1.session_id,  
    CONVERT(varchar(10), t1.status) AS status,  
    CONVERT(varchar(15), t1.command) AS command,  
    CONVERT(varchar(10), t2.state) AS worker_state,  
    w_suspended =   
      CASE t2.wait_started_ms_ticks  
        WHEN 0 THEN 0  
        ELSE   
          t3.ms_ticks - t2.wait_started_ms_ticks  
      END,  
    w_runnable =   
      CASE t2.wait_resumed_ms_ticks  
        WHEN 0 THEN 0  
        ELSE   
          t3.ms_ticks - t2.wait_resumed_ms_ticks  
      END  
  FROM sys.dm_exec_requests AS t1  
  INNER JOIN sys.dm_os_workers AS t2  
    ON t2.task_address = t1.task_address  
  CROSS JOIN sys.dm_os_sys_info AS t3  
  WHERE t1.scheduler_id IS NOT NULL;  

結果セットは次のとおりです。

 session_id status     command         worker_state w_suspended w_runnable  
 ---------- ---------- --------------- ------------ ----------- --------------------  
 4          background LAZY WRITER     SUSPENDED    688         688  
 6          background LOCK MONITOR    SUSPENDED    4657        4657
 19         background BRKR TASK       SUSPENDED    603820344   603820344  
 14         background BRKR EVENT HNDL SUSPENDED    63583641    63583641  
 51         running    SELECT          RUNNING      0           0  
 2          background RESOURCE MONITO RUNNING      0           603825954  
 3          background LAZY WRITER     SUSPENDED    422         422  
 7          background SIGNAL HANDLER  SUSPENDED    603820485   603820485  
 13         background TASK MANAGER    SUSPENDED    603824704   603824704  
 18         background BRKR TASK       SUSPENDED    603820407   603820407  
 9          background TRACE QUEUE TAS SUSPENDED    454         454  
 52         suspended  SELECT          SUSPENDED    35094       35094  
 1          background RESOURCE MONITO RUNNING      0           603825954  

出力では、w_runnablew_suspended が等しい場合、これは worker が SUSPENDED 状態となっている時刻を表します。 等しくない場合、w_runnable は、RUNNABLE 状態でワーカーが費やした時間を示します。 出力では、セッション 52 は、35,094 ミリ秒間 SUSPENDED となります。

参照

SQL Server オペレーティングシステム関連の動的管理ビュー (Transact-sql)
クエリ処理アーキテクチャ ガイド
スレッドおよびタスクのアーキテクチャ ガイド