Поделиться через


sys.dm_os_workers

Возвращает строку для каждого исполнителя в системе.

Имя столбца

Тип данных

Описание

worker_address

varbinary(8)

Адрес памяти исполнителя.

status

int

Только для внутреннего использования.

is_preemptive

bit

1 = Исполнитель работает по расписанию с вытеснением. Любой исполнитель, запускающий внешний код, работает по расписанию с вытеснением.

is_fiber

bit

1 = Исполнитель работает с использованием упрощенных пулов. Дополнительные сведения см. в разделе sp_configure (Transact-SQL).

is_sick

bit

1 = Работа исполнителя приостановлена при попытке получить спин-блокировку. Такое значение этого параметра может указывать на проблему конфликта в связи с объектом, к которому часто запрашивается доступ.

is_in_cc_exception

bit

1 = Исполнитель обрабатывает исключение, не являющееся исключением SQL Server.

is_fatal_exception

bit

Указывает на получение этим исполнителем критического исключения.

is_inside_catch

bit

1 = Исполнитель в настоящий момент обрабатывает исключение.

is_in_polling_io_completion_routine

bit

1 = Исполнитель в настоящий момент выполняет подпрограмму завершения ввода-вывода для незавершенного ввода-вывода. Дополнительные сведения см. в разделе sys.dm_io_pending_io_requests.

context_switch_count

int

Количество переключений контекста планировщика, выполненных этим исполнителем.

pending_io_count

int

Количество физических операций ввода-вывода, выполненных этим исполнителем.

pending_io_byte_count

bigint

Общее число байтов для всех незавершенных физических вводов-выводов для этого исполнителя.

pending_io_byte_average

int

Среднее число байтов для всех физических вводов-выводов для этого исполнителя.

wait_started_ms_ticks

int

Момент времени, в ms_ticks, когда данный исполнитель перешел в состояние SUSPENDED. Вычитание этого значения из ms_ticks в представлении sys.dm_os_sys_info даст число миллисекунд ожидания этим исполнителем.

wait_resumed_ms_ticks

int

Момент времени, в ms_ticks, когда данный исполнитель перешел в состояние RUNNABLE. Вычитание этого значения из ms_ticks в представлении sys.dm_os_sys_info даст число миллисекунд нахождения этого исполнителя в очереди ожидания запуска.

task_bound_ms_ticks

bigint

Момент времени, в ms_ticks, когда задача была связана с этим исполнителем.

worker_created_ms_ticks

bigint

Момент времени, в ms_ticks, когда был создан этот исполнитель.

exception_num

int

Номер ошибки последнего исключения, возникшего у этого исполнителя.

exception_severity

int

Серьезность последнего исключения, возникшего у этого исполнителя.

exception_address

varbinary(8)

Адрес кода, откуда было получено исключение

locale

int

Настройка LCID (локального идентификатора языка) для исполнителя.

affinity

bigint

Настройка схожести для исполнителя. Дополнительные сведения см. в разделе sys.dm_os_schedulers (Transact-SQL).

state

nvarchar(60)

Состояние исполнителя. Может использоваться одно из следующих значений:

INIT = Исполнитель в настоящий момент инициализируется.

RUNNING = Исполнитель в настоящий момент выполняется, в режиме без приоритетного прерывания или с приоритетным прерыванием.

RUNNABLE = Исполнитель готов к запуску в соответствии с планировщиком.

SUSPENDED = Исполнитель в настоящий момент приостановлен, находится в режиме ожидания сигнала от события.

start_quantum

bigint

Время начала текущего выполнения этого исполнителя (в миллисекундах).

end_quantum

bigint

Время окончания текущего выполнения этого исполнителя (в миллисекундах).

last_wait_type

nvarchar(60)

Тип последнего ожидания. Список типов ожидания см. в разделе sys.dm_os_wait_stats (Transact-SQL).

return_code

int

Возвращенное значение от последнего ожидания. Может использоваться одно из следующих значений:

0 =SUCCESS

3 = DEADLOCK

4 = PREMATURE_WAKEUP

258 = TIMEOUT

quantum_used

bigint

Только для внутреннего использования.

max_quantum

bigint

Только для внутреннего использования.

boost_count

int

Только для внутреннего использования.

tasks_processed_count

int

Количество задач, обработанных этим исполнителем.

fiber_address

varbinary(8)

Адрес памяти волокна, с которым связан этот исполнитель.

NULL = SQL Server не настроен для использования упрощенных пулов.

task_address

varbinary(8)

Адрес памяти текущей задачи. Дополнительные сведения см. в разделе sys.dm_os_tasks.

memory_object_address

varbinary(8)

Адрес памяти объекта памяти исполнителя. Дополнительные сведения см. в разделе sys.dm_os_memory_objects.

thread_address

varbinary(8)

Адрес памяти потока, связанного с этим исполнителем. Дополнительные сведения см. в разделе sys.dm_os_threads.

signal_worker_address

varbinary(8)

Адрес памяти исполнителя, который последним подавал сигнал этому объекту. Дополнительные сведения см. в разделе sys.dm_os_workers.

scheduler_address

varbinary(8)

Адрес памяти планировщика. Дополнительные сведения см. в разделе sys.dm_os_schedulers (Transact-SQL).

Замечания

Если значением состояния исполнителя является RUNNING, и исполнитель выполняется в режиме без приоритетного прерывания, адрес исполнителя совпадает со значением active_worker_address в sys.dm_os_schedulers.

Когда исполнитель, ожидающий события, получает сигнал, он помещается в начало очереди готовых для запуска исполнителей. SQL Server разрешает делать это тысячу раз подряд, после чего исполнитель помещается в конец очереди. Перемещение исполнителя в конец очереди имеет некоторые последствия для производительности.

Разрешения

Требует разрешения VIEW SERVER STATE на сервере.

Примеры

Можно воспользоваться следующим запросом, чтобы определить как долго исполнитель находился в состояниях SUSPENDED и 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;

Ниже приводится результирующий набор.

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

На выходе, если переменные w_runnable и w_suspended равны, они представляют время, которое исполнитель находится в состоянии SUSPENDED. Иначе переменная w_runnable представляет время, проведенное исполнителем в состоянии RUNNABLE. На выходе, сеанс 52 находится в состоянии SUSPENDED в течение 35,094 миллисекунд.