sys.dm_os_workers (Transact-SQL)

Retourne une ligne pour chaque processus de travail du système.

Nom de colonne

Type de données

Description

worker_address

varbinary(8)

Adresse mémoire du processus de travail.

status

int

À usage interne uniquement.

is_preemptive

bit

1 = le processus de travail s'exécute avec une planification préemptive. Tout processus de travail qui exécute du code externe est exécuté en mode de planification préemptive.

is_fiber

bit

1 = le processus de travail s'exécute en mode lightweight pooling. Pour plus d'informations, consultez sp_configure (Transact-SQL).

is_sick

bit

1 = le processus de travail est bloqué car il essaie toujours d'obtenir un verrouillage total de l'UC. Si ce bit est défini, cela peut signaler un problème de contention sur un objet auquel les accès sont fréquents.

is_in_cc_exception

bit

1 = le processus de travail gère actuellement une exception non-SQL Server.

is_fatal_exception

bit

Indique si le processus de travail a reçu une exception fatale.

is_inside_catch

bit

1 = le processus de travail gère actuellement une exception.

is_in_polling_io_completion_routine

bit

1 = le processus de travail exécute actuellement une routine d'exécution d'E/S pour une E/S en attente. Pour plus d'informations, consultez sys.dm_io_pending_io_requests (Transact-SQL).

context_switch_count

int

Nombre de commutateurs de contexte du planificateur qui sont exécutés par ce processus de travail.

pending_io_count

int

Nombre d'E/S physiques qui sont effectuées par ce processus de travail.

pending_io_byte_count

bigint

Nombre total d'octets correspondant à toutes les E/S physiques en attente pour ce processus de travail.

pending_io_byte_average

int

Nombre moyen d'octets des E/S physiques pour ce processus de travail.

wait_started_ms_ticks

int

Moment précis, en ms_ticks (battements d'horloge), où ce processus de travail est passé à l'état SUSPENDED. Lorsque cette valeur est soustraite de ms_ticks dans sys.dm_os_sys_info, la durée d'attente du processus de travail, en millisecondes, est retournée.

wait_resumed_ms_ticks

int

Moment précis, en ms_ticks, où ce processus de travail est passé à l'état RUNNABLE. Lorsque cette valeur est soustraite de ms_ticks dans sys.dm_os_sys_info, on obtient la durée en millisecondes que le processus de travail a passé dans la file d'attente exécutable.

task_bound_ms_ticks

bigint

Moment précis, en ms_ticks, où une tâche est liée à ce processus de travail.

worker_created_ms_ticks

bigint

Moment précis, en ms_ticks, où un processus de travail est créé.

exception_num

int

Numéro d'erreur de la dernière exception rencontrée par ce processus de travail.

exception_severity

int

Gravité de la dernière exception rencontrée par ce processus de travail.

exception_address

varbinary(8)

Adresse du code qui a levé l'exception.

locale

int

Identificateur local de paramètres régionaux pour le processus de travail.

affinity

bigint

Paramètre d'affinité du processus de travail. Pour plus d'informations, consultez sys.dm_os_schedulers (Transact-SQL).

state

nvarchar(60)

État du processus de travail. Il peut s'agir de l'une des valeurs suivantes :

INIT = le processus de travail est en cours d'initialisation.

RUNNING = le processus de travail est en cours d'exécution, en mode non préemptif ou préemptif.

RUNNABLE = le processus de travail est prêt à s'exécuter sur le planificateur.

SUSPENDED = le processus de travail est actuellement interrompu car il attend qu'un événement lui envoie un signal.

start_quantum

bigint

Temps, en millisecondes, au début de l'exécution actuelle de ce processus de travail.

end_quantum

bigint

Temps, en millisecondes, à la fin de l'exécution actuelle de ce processus de travail.

last_wait_type

nvarchar(60)

Type de la dernière attente. Pour obtenir une liste des types d'attente, consultez sys.dm_os_wait_stats (Transact-SQL).

return_code

int

Valeur retournée par la dernière attente. Il peut s'agir de l'une des valeurs suivantes :

0 =SUCCESS

3 = DEADLOCK

4 = PREMATURE_WAKEUP

258 = TIMEOUT

quantum_used

bigint

À usage interne uniquement.

max_quantum

bigint

À usage interne uniquement.

boost_count

int

À usage interne uniquement.

tasks_processed_count

int

Nombre de tâches traitées par ce processus de travail.

fiber_address

varbinary(8)

Adresse mémoire de la fibre à laquelle ce processus de travail est associé.

NULL = SQL Server n'est pas configuré pour le mode lightweight pooling.

task_address

varbinary(8)

Adresse mémoire de la tâche active. Pour plus d'informations, consultez sys.dm_os_tasks (Transact-SQL).

memory_object_address

varbinary(8)

Adresse mémoire de l'objet mémoire du processus de travail. Pour plus d'informations, consultez sys.dm_os_memory_objects (Transact-SQL).

thread_address

varbinary(8)

Adresse mémoire du thread associé au processus de travail. Pour plus d'informations, consultez sys.dm_os_threads (Transact-SQL).

signal_worker_address

varbinary(8)

Adresse mémoire du processus de travail qui a signalé cet objet en dernier lieu. Pour plus d'informations, consultez sys.dm_os_workers (Transact-SQL).

scheduler_address

varbinary(8)

Adresse mémoire du planificateur. Pour plus d'informations, consultez sys.dm_os_schedulers (Transact-SQL).

Notes

Si le processus de travail est en état RUNNING et qu'il s'exécute de façon non préemptive, son adresse correspond à la valeur de active_worker_address dans sys.dm_os_schedulers.

Lorsqu'un processus de travail en attente sur un événement est signalé, il est placé en tête de la file d'attente exécutable. SQL Server autorise cette situation mille fois de suite, après quoi le processus de travail est placé à la fin de la file d'attente. Le fait de placer un processus de travail à la fin de la file d'attente a un impact sur les performances.

Autorisations

L'autorisation VIEW SERVER STATE est nécessaire sur le serveur.

Exemples

Vous pouvez utiliser la requête suivante pour déterminer la durée d'exécution d'un processus de travail dans l'état 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;

Voici l'ensemble des résultats.

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

Dans le résultat, lorsque w_runnable et w_suspended sont identiques, la valeur représente la durée pendant laquelle le processus de travail est dans l'état SUSPENDED. Dans le cas contraire, w_runnable représente la durée pendant laquelle le processus de travail est dans l'état RUNNABLE. Dans le résultat, la session 52 est dans l'état SUSPENDED pendant 35,094 millisecondes.