sys.dm_os_workers (Transact-SQL)
Devuelve una fila por cada trabajador del sistema.
Nombre de columna |
Tipo de datos |
Descripción |
---|---|---|
worker_address |
varbinary(8) |
Dirección de memoria del trabajador. |
status |
int |
Solo para uso interno. |
is_preemptive |
bit |
1 = El trabajador está trabajando con un programa preferente. Un trabajador que ejecuta código externo trabaja con un programa preferente. |
is_fiber |
bit |
1 = El trabajador está trabajando con la opción de agrupación ligera. Para obtener más información, vea sp_configure (Transact-SQL). |
is_sick |
bit |
1 = El trabajador está atascado intentando obtener un spinlock. Si este bit está establecido, podría indicar un problema con la contención de un objeto al que se tiene acceso con frecuencia. |
is_in_cc_exception |
bit |
1 = El trabajador está controlando actualmente una excepción que no es de SQL Server. |
is_fatal_exception |
bit |
Especifica si este trabajador recibió una excepción grave. |
is_inside_catch |
bit |
1 = El trabajador está controlando actualmente una excepción. |
is_in_polling_io_completion_routine |
bit |
1 = El trabajador está ejecutando actualmente una rutina de finalización de E/S de una E/S pendiente. Para obtener más información, vea sys.dm_io_pending_io_requests (Transact-SQL). |
context_switch_count |
int |
Número de cambios de contexto del programador realizados por este trabajador. |
pending_io_count |
int |
Número de E/S físicas realizadas por este trabajador. |
pending_io_byte_count |
bigint |
Número total de bytes de todas las E/S físicas pendientes de este trabajador. |
pending_io_byte_average |
int |
Número promedio de bytes de las E/S físicas de este trabajador. |
wait_started_ms_ticks |
int |
Momento, en ms_ticks, en que este trabajador ha iniciado el estado SUSPENDED. Si se resta este valor de ms_ticks en sys.dm_os_sys_info, se consigue el número de milisegundos que el trabajador ha estado esperando. |
wait_resumed_ms_ticks |
int |
Momento, en ms_ticks, en que este trabajador ha iniciado el estado RUNNABLE. Si se resta este valor de ms_ticks en sys.dm_os_sys_info, se consigue el número de milisegundos que el trabajador ha estado en la cola de ejecutables. |
task_bound_ms_ticks |
bigint |
Momento, en ms_ticks, en que una tarea se enlaza a este trabajador. |
worker_created_ms_ticks |
bigint |
Momento, en ms_ticks, en que se crea un trabajador. |
exception_num |
int |
Número de error de la última excepción que encontró este trabajador. |
exception_severity |
int |
Gravedad de la última excepción que encontró este trabajador. |
exception_address |
varbinary(8) |
Dirección del código que activó la excepción |
locale |
int |
Configuración LCID de la configuración regional del trabajador. |
affinity |
bigint |
Afinidad del subproceso del trabajador. Coincide con la afinidad del subproceso en sys.dm_os_threads (Transact-SQL). |
state |
nvarchar(60) |
Estado del trabajador. Puede ser uno de los siguientes valores: INIT = El trabajador se está inicializando actualmente. RUNNING = El trabajador está trabajando de forma preferente o no preferente. RUNNABLE = El trabajador está preparado para ejecutarse en el programador. SUSPENDED = El trabajador está suspendido actualmente, esperando a que un evento le envíe una señal. |
start_quantum |
bigint |
Tiempo en milisegundos al inicio de la ejecución actual de este trabajador. |
end_quantum |
bigint |
Tiempo en milisegundos al final de la ejecución actual de este trabajador. |
last_wait_type |
nvarchar(60) |
Tipo de la última espera. Para obtener una lista de tipos, vea sys.dm_os_wait_stats (Transact-SQL). |
return_code |
int |
Valor devuelto de la última espera. Puede ser uno de los siguientes valores: 0 =SUCCESS 3 = DEADLOCK 4 = PREMATURE_WAKEUP 258 = TIMEOUT |
quantum_used |
bigint |
Solo para uso interno. |
max_quantum |
bigint |
Solo para uso interno. |
boost_count |
int |
Solo para uso interno. |
tasks_processed_count |
int |
Número de tareas procesadas por este trabajador. |
fiber_address |
varbinary(8) |
Dirección de memoria de la fibra a la que está asociado este trabajador. NULL = SQL Server no está configurado para agrupación ligera. |
task_address |
varbinary(8) |
Dirección de memoria de la tarea actual. Para obtener más información, vea sys.dm_os_tasks (Transact-SQL). |
memory_object_address |
varbinary(8) |
Dirección de memoria del objeto de memoria del trabajador. Para obtener más información, vea sys.dm_os_memory_objects (Transact-SQL). |
thread_address |
varbinary(8) |
Dirección de memoria del subproceso asociado a este trabajador. Para obtener más información, vea sys.dm_os_threads (Transact-SQL). |
signal_worker_address |
varbinary(8) |
Dirección de memoria del último trabajador que indicó este objeto. Para obtener más información, vea sys.dm_os_workers (Transact-SQL). |
scheduler_address |
varbinary(8) |
Dirección de memoria del programador. Para obtener más información, vea sys.dm_os_schedulers (Transact-SQL). |
processor_group |
smallint |
Almacena el identificador de grupo de procesadores que está asignado a este subproceso. |
Comentarios
Si el estado de trabajador es RUNNING y se está ejecutando de forma no preferente, la dirección del trabajador coincide con active_worker_address en sys.dm_os_schedulers.
Cuando se señala a un trabajador que espera en un evento, el trabajador se coloca al principio de la cola de ejecutables. SQL Server permite que suceda esto 1.000 veces en una fila; después, el trabajador se coloca al final de la misma. Mover un trabajador al final de la cola tiene algunas implicaciones sobre el rendimiento.
Permisos
Requiere el permiso VIEW SERVER STATE en el servidor.
Ejemplos
Puede utilizar la siguiente consulta para saber cuánto tiempo se ha estado ejecutando un trabajador en un estado 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;
El conjunto de resultados es el siguiente.
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
En la salida, si w_runnable y w_suspended son iguales, indica el tiempo que el trabajador está en el estado SUSPENDED. En caso contrario, w_runnable representa el tiempo que ha pasado el trabajador en el estado RUNNABLE. En la salida, la sesión 52 está en estado SUSPENDED durante 35,094 milisegundos.