sys.dm_os_waiting_tasks (Transact-SQL)

适用于:SQL Server Azure SQL 数据库 Azure SQL 托管实例 Azure Synapse Analytics Analytics Platform System (PDW)

返回有关正在等待某些资源的任务的等待队列的信息。 有关任务的详细信息,请参阅 “线程和任务体系结构指南”。

注意

若要从 Azure Synapse Analytics 或 Analytics 平台系统(PDW)调用此名称,请使用名称 sys.dm_pdw_nodes_os_waiting_tasks。 Azure Synapse Analytics 中的无服务器 SQL 池不支持此语法。

列名称 数据类型 描述
waiting_task_address varbinary(8) 等待任务的地址。
session_id smallint 与任务关联的会话的 ID。
exec_context_id int 与任务关联的执行上下文的 ID。
wait_duration_ms bigint 此等待类型的总等待时间(毫秒)。 这次是独占的 signal_wait_time
wait_type nvarchar(60) 等待类型的名称。
resource_address varbinary(8) 任务等待的资源的地址。
blocking_task_address varbinary(8) 当前持有此资源的任务。
blocking_session_id smallint 正在阻塞请求的会话的 ID。 如果此列 NULL是,则请求不会被阻止,或者阻止会话的会话信息不可用(或无法识别)。

-2 = 阻塞资源由孤立分布式事务拥有。

-3 = 阻塞资源由延迟恢复事务拥有。

-4 = session_id 由于内部闩锁状态转换,无法确定阻塞闩锁所有者。
blocking_exec_context_id int 正在阻塞的任务的执行上下文 ID。
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-type:

  • 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> 可以是:
      • 对于 DATABASE: databaselock subresource=<databaselock-subresource> dbid=<db-id>
      • 对于 FILE: filelock fileid=<file-id> subresource=<filelock-subresource> dbid=<db-id>
      • 对于 OBJECT: objectlock lockPartition=<lock-partition-id> objid=<obj-id> subresource=<objectlock-subresource> dbid=<db-id>
      • 对于 PAGE: pagelock fileid=<file-id> pageid=<page-id> dbid=<db-id> subresource=<pagelock-subresource>
      • 对于密钥: keylock hobtid=<hobt-id> dbid=<db-id>
      • 对于 EXTENT: 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、IX、SIU、SIX、UIX、BU、RangeS-S、RangeS-U、RangeI-N、RangeI-S、RangeI-U、RangeI-X、RangeX-U、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 数据库“基本”、“S0”和“S1”服务目标中,对于“弹性池”中的数据库,服务器管理员帐户、Microsoft Entra 管理员帐户或 ##MS_ServerStateReader## 服务器角色中的成员身份为必填项。 对于所有其他 SQL 数据库服务目标,需要数据库的 VIEW DATABASE STATE 权限或 ##MS_ServerStateReader## 服务器角色中的成员身份。

SQL Server 2022 及更高版本的权限

要求对服务器具有 VIEW SERVER PERFORMANCE STATE 权限。

示例

A. 从阻止的会话中识别任务

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