sys.dm_os_workers (Transact-SQL)

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

Имя столбца

Тип данных

Описание

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_threads (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 (Transact-SQL).

memory_object_address

varbinary(8)

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

thread_address

varbinary(8)

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

signal_worker_address

varbinary(8)

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

scheduler_address

varbinary(8)

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

processor_group

smallint

Сохраняет идентификатор группы процессоров, назначенный данному потоку.

Замечания

Если значением состояния исполнителя является 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 миллисекунд.