sys.dm_os_workers (Transact-SQL)

Retorna uma linha para cada trabalhador no sistema.

Nome da coluna

Tipo de dados

Descrição

worker_address

varbinary(8)

Endereço de memória do trabalhador.

status

int

Somente para uso interno.

is_preemptive

bit

1 = o trabalhador está executando com agendamento preventivo. Qualquer trabalhador que esteja executando código externo será executado sob agendamento preemptivo.

is_fiber

bit

1 = o trabalhador está executando com lightweight pooling. Para obter mais informações, consulte sp_configure (Transact-SQL).

is_sick

bit

1 = o trabalhador está preso tentando obter um bloqueio de giro. Se este bit estiver definido, isto pode indicar um problema com contenção em um objeto frequentemente acessado.

is_in_cc_exception

bit

1 = atualmente o trabalhador está tratando uma exceção não relativa ao SQL Server.

is_fatal_exception

bit

Especifica se este trabalhador recebeu uma exceção fatal.

is_inside_catch

bit

1 = atualmente o trabalhador está tratando uma exceção.

is_in_polling_io_completion_routine

bit

1 = atualmente o trabalhador está executando uma rotina de conclusão de E/S para uma E/S pendente. Para obter mais informações, consulte sys.dm_io_pending_io_requests (Transact-SQL).

context_switch_count

int

Número de alternâncias de contexto do agendador executadas por este trabalhador.

pending_io_count

int

Número de E/Ss físicas executadas por este trabalhador.

pending_io_byte_count

bigint

Número total de bytes para todas as E/Ss físicas pendentes para este trabalhador.

pending_io_byte_average

int

Número médio de bytes das E/Ss físicas para este trabalhador.

wait_started_ms_ticks

int

Ponto no tempo, em ms_ticks, em que este trabalhador entrou no estado SUSPENDED. A subtração deste valor de ms_ticks em sys.dm_os_sys_info retorna o número de milissegundos de espera do funcionário.

wait_resumed_ms_ticks

int

Ponto no tempo, em ms_ticks, em que este trabalhador entrou no estado RUNNABLE. A subtração deste valor de ms_ticks em sys.dm_os_sys_info retorna o número de milissegundos de espera do funcionário na fila executável.

task_bound_ms_ticks

bigint

Ponto no tempo, em ms_ticks, em que uma tarefa foi associada a este trabalhador.

worker_created_ms_ticks

bigint

Ponto no tempo, em ms_ticks, em que um trabalhador foi criado.

exception_num

int

Número do erro da última exceção que este trabalhador encontrou.

exception_severity

int

Gravidade da última exceção que este trabalhador encontrou.

exception_address

varbinary(8)

Endereço de código que lançou a exceção

locale

int

Configuração de LCID da localidade do trabalhador.

affinity

bigint

A afinidade de thread do trabalhador. Corresponde à afinidade de thread em sys.dm_os_threads (Transact-SQL).

state

nvarchar(60)

Estado do trabalhador. Pode ser um dos seguintes valores:

INIT = atualmente o trabalhador está sendo inicializado.

RUNNING = atualmente o trabalhador está executando de modo não preemptivo ou preemptivo.

RUNNABLE = o trabalhador está pronto para execução no agendador.

SUSPENDED = o trabalhador está atualmente suspenso, aguardando que um evento envie um sinal para ele.

start_quantum

bigint

Tempo, em milissegundos, no início da execução atual deste trabalhador.

end_quantum

bigint

Tempo, em milissegundos, no final da execução atual deste trabalhador.

last_wait_type

nvarchar(60)

Tipo da última espera. Para obter uma lista de tipos de espera, consulte sys.dm_os_wait_stats (Transact-SQL).

return_code

int

Valor de retorno da última espera. Pode ser um dos seguintes valores:

0 =SUCCESS

3 = DEADLOCK

4 = PREMATURE_WAKEUP

258 = TIMEOUT

quantum_used

bigint

Somente para uso interno.

max_quantum

bigint

Somente para uso interno.

boost_count

int

Somente para uso interno.

tasks_processed_count

int

Número de tarefas que este trabalhador processou.

fiber_address

varbinary(8)

Endereço de memória da fibra à qual este trabalhador está associado.

NULL = o SQL Server não está configurado para lightweight pooling.

task_address

varbinary(8)

Endereço de memória da tarefa atual. Para obter mais informações, consulte sys.dm_os_tasks (Transact-SQL).

memory_object_address

varbinary(8)

Endereço de memória do objeto de memória do trabalhador. Para obter mais informações, consulte sys.dm_os_memory_objects (Transact-SQL).

thread_address

varbinary(8)

Endereço de memória do thread associado a este trabalhador. Para obter mais informações, consulte sys.dm_os_threads (Transact-SQL).

signal_worker_address

varbinary(8)

Endereço de memória do trabalhador que sinalizou este objeto pela última vez. Para obter mais informações, consulte sys.dm_os_workers (Transact-SQL).

scheduler_address

varbinary(8)

Endereço de memória do agendador. Para obter mais informações, consulte sys.dm_os_schedulers (Transact-SQL).

processor_group

smallint

Armazena a ID do grupo de processador que é atribuída a este thread.

Comentários

Se o estado do trabalhador for RUNNING e ele estiver em execução de modo não preemptivo, o endereço do trabalhador corresponderá a active_worker_address em sys.dm_os_schedulers.

Quando um trabalhador que está esperando um evento for sinalizado, o trabalhador será colocado no topo da fila de executáveis. O SQL Server permite que isso ocorra mil vezes em uma linha, após o que o trabalhador será colocado no final da fila. Mover um trabalhador para o final da fila tem algumas implicações de desempenho.

Permissões

Requer permissão VIEW SERVER STATE no servidor.

Exemplos

Você pode usar a consulta a seguir para descobrir por quanto tempo um trabalhador esteve em execução em um estado SUSPENDED ou 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;

Aqui está o conjunto de resultados.

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

Na saída, quando w_runnable e w_suspended forem iguais, isto representará o tempo que o trabalhador se encontra no estado SUSPENDED. Caso contrário, w_runnable representará o tempo gasto pelo trabalhador no estado RUNNABLE. Na saída, a sessão 52 está SUSPENDED durante 35,094 milissegundos.