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.