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.