sys.dm_os_workers (Transact-SQL)
Restituisce una riga per ogni thread di lavoro nel sistema.
Nome colonna |
Tipo di dati |
Descrizione |
---|---|---|
worker_address |
varbinary(8) |
Indirizzo di memoria del thread di lavoro. |
status |
int |
Solo per uso interno. |
is_preemptive |
bit |
1 = Il thread di lavoro è in esecuzione nell'ambito di una pianificazione preemptive. Qualsiasi thread di lavoro che esegue codice esterno viene eseguito nell'ambito di una pianificazione preemptive. |
is_fiber |
bit |
1 = Il thread di lavoro è in esecuzione nell'ambito del lightweight pooling. Per ulteriori informazioni, vedere sp_configure (Transact-SQL). |
is_sick |
bit |
1 = Il thread di lavoro è bloccato nel tentativo di ottenere uno spinlock. Se questo bit viene impostato, ciò potrebbe indicare un problema a livello di contesa in un oggetto a cui si accede di frequente. |
is_in_cc_exception |
bit |
1 = Il thread di lavoro sta gestendo un'eccezione non SQL Server. |
is_fatal_exception |
bit |
Specifica se il thread di lavoro ha ricevuto un'eccezione irreversibile. |
is_inside_catch |
bit |
1 = Il thread di lavoro sta gestendo un'eccezione. |
is_in_polling_io_completion_routine |
bit |
1 = Il thread di lavoro sta eseguendo una routine di completamento dell'I/O per un I/O in sospeso. Per ulteriori informazioni, vedere sys.dm_io_pending_io_requests (Transact-SQL). |
context_switch_count |
int |
Numero di cambi di contesto dell'utilità di pianificazione eseguiti dal thread di lavoro. |
pending_io_count |
int |
Numero di I/O fisici eseguiti dal thread di lavoro. |
pending_io_byte_count |
bigint |
Numero totale di byte per tutti gli I/O fisici in sospeso per il thread di lavoro. |
pending_io_byte_average |
int |
Numero medio di byte per gli I/O fisici per il thread di lavoro. |
wait_started_ms_ticks |
int |
Momento, espresso in ms_ticks, in cui lo stato del thread di lavoro diventa SUSPENDED. Se si sottrae questo valore da ms_ticks in sys.dm_os_sys_info, viene restituito il numero di millisecondi in cui il thread di lavoro è rimasto in attesa. |
wait_resumed_ms_ticks |
int |
Momento, espresso in ms_ticks, in cui lo stato del thread di lavoro diventa RUNNABLE. Se si sottrae questo valore da ms_ticks in sys.dm_os_sys_info, viene restituito il numero di millisecondi per cui il thread di lavoro è rimasto nella coda eseguibile. |
task_bound_ms_ticks |
bigint |
Momento, espresso in ms_ticks, in cui un'attività viene associata al thread di lavoro. |
worker_created_ms_ticks |
bigint |
Momento, espresso in ms_ticks, in cui viene creato un thread di lavoro. |
exception_num |
int |
Numero di errore dell'ultima eccezione rilevata dal thread di lavoro. |
exception_severity |
int |
Gravità dell'ultima eccezione rilevata dal thread di lavoro. |
exception_address |
varbinary(8) |
Indirizzo del codice che ha generato l'eccezione. |
locale |
int |
Identificatore delle impostazioni locali (LCID) del thread di lavoro. |
affinity |
bigint |
Impostazioni relative all'affinità per il thread di lavoro. Per ulteriori informazioni, vedere sys.dm_os_schedulers (Transact-SQL). |
state |
nvarchar(60) |
Stato del thread di lavoro. I possibili valori sono i seguenti: INIT = Il thread di lavoro è in fase di inizializzazione. RUNNING = Il thread di lavoro è in esecuzione in modalità non preemptive o preemptive. RUNNABLE = Il thread di lavoro è pronto per essere eseguito nell'utilità di pianificazione. SUSPENDED = Il thread di lavoro è sospeso ed è in attesa di un evento per inviare un segnale. |
start_quantum |
bigint |
Tempo, espresso in millisecondi, all'inizio dell'esecuzione del thread di lavoro. |
end_quantum |
bigint |
Tempo, espresso in millisecondi, alla fine dell'esecuzione del thread di lavoro. |
last_wait_type |
nvarchar(60) |
Tipo dell'ultima attesa. Per un elenco dei tipi di attesa, vedere sys.dm_os_wait_stats (Transact-SQL). |
return_code |
int |
Valore restituito dall'ultima attesa. I possibili valori sono i seguenti: 0 =SUCCESS 3 = DEADLOCK 4 = PREMATURE_WAKEUP 258 = TIMEOUT |
quantum_used |
bigint |
Solo per uso interno. |
max_quantum |
bigint |
Solo per uso interno. |
boost_count |
int |
Solo per uso interno. |
tasks_processed_count |
int |
Numero di attività elaborate dal thread di lavoro. |
fiber_address |
varbinary(8) |
Indirizzo di memoria del fiber a cui il thread di lavoro è associato. NULL = SQL Server non è configurato per il lightweight pooling. |
task_address |
varbinary(8) |
Indirizzo di memoria dell'attività corrente. Per ulteriori informazioni, vedere sys.dm_os_tasks (Transact-SQL). |
memory_object_address |
varbinary(8) |
Indirizzo di memoria dell'oggetto memoria del thread di lavoro. Per ulteriori informazioni, vedere sys.dm_os_memory_objects (Transact-SQL). |
thread_address |
varbinary(8) |
Indirizzo di memoria del thread associato al thread di lavoro corrente. Per ulteriori informazioni, vedere sys.dm_os_threads (Transact-SQL). |
signal_worker_address |
varbinary(8) |
Indirizzo di memoria del thread di lavoro che ha segnalato per ultimo l'oggetto. Per ulteriori informazioni, vedere sys.dm_os_workers (Transact-SQL). |
scheduler_address |
varbinary(8) |
Indirizzo di memoria dell'utilità di pianificazione. Per ulteriori informazioni, vedere sys.dm_os_schedulers (Transact-SQL). |
Osservazioni
Se lo stato del thread di lavoro è RUNNING e il thread di lavoro è in esecuzione in modalità non preemptive, l'indirizzo del thread di lavoro corrisponde alla colonna active_worker_address in sys.dm_os_schedulers.
Quando viene segnalato un thread di lavoro in attesa di un evento, tale thread viene inserito all'inizio della coda eseguibile. SQL Server consente l'esecuzione di questa operazione mille volte in una riga. Superato questo valore, il thread di lavoro viene inserito alla fine della coda. Lo spostamento di un thread di lavoro alla fine della coda è caratterizzato da alcune implicazioni a livello di prestazioni.
Autorizzazioni
È richiesta l'autorizzazione VIEW SERVER STATE nel server.
Esempi
La query seguente consente di determinare per quanto tempo un thread di lavoro è rimasto in esecuzione in stato SUSPENDED o 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;
Set di risultati:
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
Nell'output, i valori equivalenti di w_runnable e w_suspended indicano il tempo durante cui il thread di lavoro rimane in stato SUSPENDED. In tutti gli altri casi w_runnable rappresenta il tempo trascorso dal thread di lavoro in stato RUNNABLE. Nell'output la sessione 52 è in stato SUSPENDED per 35,094 millisecondi.