sys.dm_os_waiting_tasks (Transact-SQL)

Применимо: SQL Server База данных SQL Azure Управляемый экземпляр SQL Azure azure Synapse Analytics Analytics Platform System (PDW)

Возвращает сведения об очереди задач, ожидающих освобождения определенного ресурса. Дополнительные сведения о задачах см. в руководстве по архитектуре потоков и задач.

Примечание.

Чтобы вызвать это из Azure Synapse Analytics или Analytics Platform System (PDW), используйте имя sys.dm_pdw_nodes_os_waiting_tasks. Этот синтаксис не поддерживается бессерверным пулом SQL в Azure Synapse Analytics.

Имя столбца Тип данных Description
waiting_task_address varbinary(8) Адрес ожидающей задачи.
session_id smallint Идентификатор сеанса, связанного с этой задачей.
exec_context_id int Идентификатор контекста выполнения, связанного с этой задачей.
wait_duration_ms bigint Общее время ожидания для этого типа ожиданий в миллисекундах. Это время включает в себя signal_wait_time.
wait_type nvarchar(60) Имя типа ожидания.
resource_address varbinary(8) Адрес ресурса, освобождения которого ожидает задача.
blocking_task_address varbinary(8) Задача, которая в настоящий момент блокирует этот ресурс.
blocking_session_id smallint Идентификатор сеанса, блокирующего данный запрос. Если этот столбец NULLуказан, запрос не блокируется или сведения о сеансе блокирующего сеанса недоступны (или не могут быть идентифицированы).

-2 = блокирующий ресурс принадлежит потерянным распределенным транзакциям.

-3 = блокирующий ресурс принадлежит отложенной транзакции восстановления.

-4 = session_id Не удалось определить владельца блокировки из-за внутренних переходов состояния блокировки.
blocking_exec_context_id int Идентификатор контекста выполнения блокирующей задачи.
resource_description nvarchar(3072) Описание используемого ресурса. Дополнительные сведения см. в resource_description столбце.
pdw_node_id int Область применения: Azure Synapse Analytics, Analytics Platform System (PDW)

Идентификатор узла, на который находится данное распределение.

Столбец resource_description

Столбец resource_description имеет следующие возможные значения.

Владелец ресурса пула потоков:

  • threadpool id=scheduler<hex-address>

Владелец ресурса параллельного запроса:

  • exchangeEvent id={Port|Pipe}<hex-address> WaitType=<exchange-wait-type> nodeId=<exchange-node-id>

Тип Exchange-wait::

  • e_waitNone
  • e_waitPipeNewRow
  • e_waitPipeGetRow
  • e_waitSynchronizeConsumerOpen
  • e_waitPortOpen
  • e_waitPortClose
  • e_waitRange

Блокировка владельца ресурса:

  • <type-specific-description> id=lock<lock-hex-address> mode=<mode> associatedObjectId=<associated-obj-id>
    • <type-specific-description> может быть:
      • Для БАЗЫ ДАННЫХ: databaselock subresource=<databaselock-subresource> dbid=<db-id>
      • Для ФАЙЛА: filelock fileid=<file-id> subresource=<filelock-subresource> dbid=<db-id>
      • Для ОБЪЕКТА: objectlock lockPartition=<lock-partition-id> objid=<obj-id> subresource=<objectlock-subresource> dbid=<db-id>
      • Для СТРАНИЦЫ: pagelock fileid=<file-id> pageid=<page-id> dbid=<db-id> subresource=<pagelock-subresource>
      • Для ключа: keylock hobtid=<hobt-id> dbid=<db-id>
      • Для ЭКСТЕНТ: extentlock fileid=<file-id> pageid=<page-id> dbid=<db-id>
      • Для RID: ridlock fileid=<file-id> pageid=<page-id> dbid=<db-id>
      • Для ПРИЛОЖЕНИЯ: applicationlock hash=<hash> databasePrincipalId=<role-id> dbid=<db-id>
      • Для метаданных: metadatalock subresource=<metadata-subresource> classid=<metadatalock-description> dbid=<db-id>
      • Для HOBT: hobtlock hobtid=<hobt-id> subresource=<hobt-subresource> dbid=<db-id>
      • Для ALLOCATION_UNIT: allocunitlock hobtid=<hobt-id> subresource=<alloc-unit-subresource> dbid=<db-id>
    • <mode> может быть: Sch-S, Sch-M, S, U, X, IS, IU, IX, SIU, SIX, UIX, BU, RangeS-S, RangeS-U, RangeI-N, RangeI-S, RangeI-U, RangeI-X, RangeX-U, RangeX-U, RangeX-X, RangeX-X

Внешний владелец ресурса:

  • Внешний ExternalResource=<wait-type>

Универсальный владелец ресурса:

  • TransactionMutex TransactionInfo Workspace=<workspace-id>
  • Mutex
  • CLRTaskJoin
  • CLRMonitorEvent
  • CLRRWLockEvent
  • resourceWait

Владелец ресурса блокировки:

  • <db-id>:<file-id>:<page-in-file>
  • <GUID>
  • <latch-class> (<latch-address>)

Владелец ресурса XACT (транзакция) возникает при включенной оптимизированной блокировке :

  • xactlock: xactlock xdesIdLow=<xdesIdLow> xdesIdHigh=<xdesIdHigh> dbid=<dbid> id=<resource id> mode=<mode> UnderlyingResource (<keylock|ridlock>) hobtId=<hobtId> dbid=<dbid>

Разрешения

На SQL Server и управляемом экземпляре SQL необходимо разрешение VIEW SERVER STATE.

Для целей службы База данных SQL Basic, S0 и S1, а также для баз данных в эластичных пулах, учетной записи администратора сервера, учетной записи администратора Microsoft Entra или членства в ##MS_ServerStateReader## роли сервера требуется. Для всех остальных целей обслуживания базы данных SQL требуется разрешение VIEW DATABASE STATE в базе данных или членство в роли сервера ##MS_ServerStateReader##.

Разрешения для SQL Server 2022 и более поздних версий

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

Примеры

А. Определение задач из заблокированных сеансов

SELECT * FROM sys.dm_os_waiting_tasks
WHERE blocking_session_id IS NOT NULL;

B. Просмотр задач ожидания на подключение

SELECT st.text AS [SQL Text], c.connection_id, w.session_id,
  w.wait_duration_ms, w.wait_type, w.resource_address,
  w.blocking_session_id, w.resource_description, c.client_net_address, c.connect_time
FROM sys.dm_os_waiting_tasks AS w
INNER JOIN sys.dm_exec_connections AS c ON w.session_id = c.session_id
CROSS APPLY (SELECT * FROM sys.dm_exec_sql_text(c.most_recent_sql_handle)) AS st
              WHERE w.session_id > 50 AND w.wait_duration_ms > 0
ORDER BY c.connection_id, w.session_id;
GO

C. Просмотр задач ожидания для всех пользовательских процессов с дополнительными сведениями

SELECT 'Waiting_tasks' AS [Information], owt.session_id,
    owt.wait_duration_ms, owt.wait_type, owt.blocking_session_id,
    owt.resource_description, es.program_name, est.text,
    est.dbid, eqp.query_plan, er.database_id, es.cpu_time,
    es.memory_usage*8 AS memory_usage_KB
FROM sys.dm_os_waiting_tasks owt
INNER JOIN sys.dm_exec_sessions es ON owt.session_id = es.session_id
INNER JOIN sys.dm_exec_requests er ON es.session_id = er.session_id
OUTER APPLY sys.dm_exec_sql_text (er.sql_handle) est
OUTER APPLY sys.dm_exec_query_plan (er.plan_handle) eqp
WHERE es.is_user_process = 1
ORDER BY owt.session_id;
GO