sys.dm_os_workers (Transact-SQL)
針對系統中每一個工作者,各傳回一個資料列。
資料行名稱 |
資料類型 |
描述 |
---|---|---|
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_info 中的 ms_ticks 減去這個值會傳回工作者等候的毫秒數。 |
wait_resumed_ms_ticks |
int |
當這個工作者進入 RUNNABLE 狀態時,在 ms_ticks 中的時間點。從 sys.dm_os_sys_info 中的 ms_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_threads (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) |
這個工作者相關聯之 Fiber 的記憶體位址。 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)>。 |
processor_group |
smallint |
儲存指派給這個執行緒的處理器群組識別碼。 |
備註
如果工作者狀態是 RUNNING,且工作者是以非先佔式執行,則工作者位址會符合 sys.dm_os_schedulers 中的 active_worker_address。
當立即通知等待事件的工作者時,會將工作者放在可執行佇列的開頭。SQL Server 可讓它在資料列出現一千次,在這之後工作者會放在佇列結尾。將工作者移到佇列結尾,會有一些效能隱含作用。
權限
需要伺服器的 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 處於 SUSPENDED 狀態的時間為 35,094 毫秒。