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 миллисекунд.