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

Sólo 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

Configuración de afinidad del trabajador. Para obtener más información, vea sys.dm_os_schedulers (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 por un evento para enviarle 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

Sólo para uso interno.

max_quantum

bigint

Sólo para uso interno.

boost_count

int

Sólo 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 con la que está asociado este trabajador.

NULL = SQL Server no está configurado para lightweight pooling.

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 con 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).

Notas

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;

Éste es el 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

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.