sys.dm_os_workers (Transact-SQL)

システム内のワーカーごとに 1 行のデータを返します。

列名

データ型

説明

worker_address

varbinary(8)

ワーカーのメモリ アドレス。

status

int

内部使用のみ。

is_preemptive

bit

1 = ワーカーは、プリエンプティブなスケジュール設定で実行中です。外部コードを実行中のワーカーは、プリエンプティブなスケジュール設定で実行されます。

is_fiber

bit

1 = ワーカーは、簡易プーリングで実行中です。詳細については、「sp_configure (Transact-SQL)」を参照してください。

is_sick

bit

1 = ワーカーは、スピン ロックを取得しようとして停止しています。このビットが設定されている場合、頻繁にアクセスされるオブジェクトで競合の問題が発生している可能性があります。

is_in_cc_exception

bit

1 = ワーカーは、現在 SQL Server 以外の例外を処理中です。

is_fatal_exception

bit

ワーカーが重大な例外を受け取ったかどうかを示します。

is_inside_catch

bit

1 = ワーカーは、現在例外を処理中です。

is_in_polling_io_completion_routine

bit

1 = ワーカーは、現在保留中の I/O に対して I/O 完了ルーチンを実行中です。詳細については、「sys.dm_io_pending_io_requests (Transact-SQL)」を参照してください。

context_switch_count

int

ワーカーによって実行された、スケジューラのコンテキスト切り替えの数。

pending_io_count

int

ワーカーによって実行された物理 I/O の数。

pending_io_byte_count

bigint

ワーカーに対して保留となっているすべての物理 I/O の合計バイト数。

pending_io_byte_average

int

ワーカーの物理 I/O の平均バイト数。

wait_started_ms_ticks

int

ワーカーの状態が SUSPENDED になった時点 (ms_ticks)。この値を sys.dm_os_sys_infoms_ticks から減算すると、ワーカーが待機している時間がミリ秒単位で返されます。

wait_resumed_ms_ticks

int

ワーカーの状態が RUNNABLE になった時点 (ms_ticks)。この値を sys.dm_os_sys_infoms_ticks から減算すると、ワーカーが実行可能キューで待機している時間 (ミリ秒単位) を求めることができます。

task_bound_ms_ticks

bigint

タスクがワーカーにバインドされた時点 (ms_ticks)。

worker_created_ms_ticks

bigint

ワーカーが作成された時点 (ms_ticks)。

exception_num

int

ワーカーで前回発生した例外のエラー番号。

exception_severity

int

ワーカーで前回発生した例外の重大度。

exception_address

varbinary(8)

例外を返したコード アドレス。

locale

int

ワーカーのロケール LCID 設定。

affinity

bigint

ワーカーの関係設定。詳細については、「sys.dm_os_schedulers (Transact-SQL)」を参照してください。

state

nvarchar(60)

ワーカーの状態。次の値のいずれかです。

INIT = ワーカーは、現在初期化中です。

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

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

SUSPENDED = ワーカーは現在中断されています。イベントによるシグナル送信を待機中です。

start_quantum

bigint

ワーカーの現在の実行が開始された時間 (ミリ秒単位)。

end_quantum

bigint

ワーカーの現在の実行が終了した時間 (ミリ秒単位)。

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

ワーカーが処理したタスクの数。

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)

ワーカーに関連付けられているスレッドのメモリ アドレス。詳細については、「sys.dm_os_threads (Transact-SQL)」を参照してください。

signal_worker_address

varbinary(8)

オブジェクトに最後にシグナルを送信したワーカーのメモリ アドレス。詳細については、「sys.dm_os_workers (Transact-SQL)」を参照してください。

scheduler_address

varbinary(8)

スケジューラのメモリ アドレス。詳細については、「sys.dm_os_schedulers (Transact-SQL)」を参照してください。

説明

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

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

権限

サーバーに対する VIEW SERVER 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_runnable と w_suspended が等しい場合、この出力は、ワーカーが SUSPENDED 状態にある時間を示します。等しくない場合、w_runnable は、RUNNABLE 状態でワーカーが費やした時間を示します。この出力では、セッション 52 は 35,094 ミリ秒間 SUSPENDED 状態にあることがわかります。