Compartir a través de


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.