Compartilhar via


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 freqüentemente 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. Subtrair este valor de ms_ticks em sys.dm_os_sys_info retorna o número de milissegundos que o trabalhador esperou.

wait_resumed_ms_ticks

int

Ponto no tempo, em ms_ticks, em que este trabalhador entrou no estado RUNNABLE. Subtrair este valor de ms_ticks em sys.dm_os_sys_info retorna o número de milissegundos que o trabalhador esteve na fila de executáveis.

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

Configuração de afinidade do trabalhador. Para obter mais informações, consulte sys.dm_os_schedulers (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).

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á ao 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;

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.