sys.dm_os_workers (Transact-SQL)
適用於:SQL Server Azure SQL 資料庫 Azure SQL 受控執行個體 Azure Synapse Analytics Analytics Platform System (PDW)
傳回系統中每個背景工作角色的數據列。 如需背景工作角色的詳細資訊,請參閱 線程和工作架構指南。
注意
若要從 Azure Synapse Analytics 或 Analytics Platform System (PDW) 呼叫此專案,請使用名稱 sys.dm_pdw_nodes_os_workers。 Azure Synapse Analytics 的無伺服器 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 | bigint | 當此背景工作角色進入 SUSPENDED 狀態時,ms_ticks時間點。 從 sys.dm_os_sys_info 中的ms_ticks減去此值,會傳回背景工作角色等候的毫秒數。 |
wait_resumed_ms_ticks | bigint | 當此背景工作角色進入 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) | 擲回例外狀況的程式代碼位址 |
相似性 | 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) | 與此背景工作角色相關聯之光纖的記憶體位址。 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。 |
scheduler_address | varbinary(8) | 排程器的記憶體位址。 如需詳細資訊,請參閱 sys.dm_os_schedulers (Transact-SQL) 。 |
processor_group | smallint | 儲存指派給此線程的處理器群組標識碼。 |
pdw_node_id | int | 適用於:Azure Synapse Analytics、Analytics Platform System (PDW) 此散發節點的標識碼。 |
備註
如果背景工作狀態為 RUNNING,且背景工作角色非先佔執行,則背景工作位址會比對sys.dm_os_schedulers中的active_worker_address。
當等候事件的背景工作角色收到訊號時,背景工作角色會放在可執行佇列的前端。 SQL Server 允許在一個數據列中發生一千次,之後背景工作角色就會放在佇列結尾。 將背景工作角色移至佇列結尾具有一些效能影響。
權限
在 SQL Server 上,需要 VIEW SERVER STATE
許可權。
在 SQL Database 進階版層級需要資料庫的 VIEW DATABASE STATE
權限。 在 SQL 資料庫 標準和基本層上,需要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_suspended
相等時w_runnable
,這代表背景工作角色處於 SUSPENDED 狀態的時間。 否則, w_runnable
表示背景工作角色在 RUNNABLE 狀態所花費的時間。 在輸出中,會話52
為SUSPENDED
35,094
毫秒。