sys.dm_os_workers (Transact-SQL)

Viene restituita 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

Consente di specificare se è stata ricevuta un'eccezione irreversibile dal thread di lavoro.

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 tramite cui è stata generata l'eccezione.

locale

int

Identificatore delle impostazioni locali (LCID) del thread di lavoro.

affinity

bigint

Affinità del thread di lavoro. Corrisponde all'affinità del thread in sys.dm_os_threads (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).

processor_group

smallint

Archivia l'ID del gruppo di processori assegnato a questo thread.

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.