sys.dm_os_waiting_tasks(Transact-SQL)

适用于:SQL ServerAzure SQL 数据库Azure SQL 托管实例Azure Synapse AnalyticsAnalytics 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) 等待类型的名称。 有关详细信息,请参阅 sys.dm_os_wait_stats
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 和分析平台系统(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> 可以是:

    • 对于 DATABASEdatabaselock subresource=<databaselock-subresource> dbid=<db-id>
    • 对于 FILEfilelock fileid=<file-id> subresource=<filelock-subresource> dbid=<db-id>
    • 对于 OBJECTobjectlock lockPartition=<lock-partition-id> objid=<obj-id> subresource=<objectlock-subresource> dbid=<db-id>
    • 对于 PAGEpagelock fileid=<file-id> pageid=<page-id> dbid=<db-id> subresource=<pagelock-subresource>
    • 对于 Keykeylock hobtid=<hobt-id> dbid=<db-id>
    • 对于 EXTENTextentlock fileid=<file-id> pageid=<page-id> dbid=<db-id>
    • 对于 RIDridlock fileid=<file-id> pageid=<page-id> dbid=<db-id>
    • 对于 APPLICATIONapplicationlock hash=<hash> databasePrincipalId=<role-id> dbid=<db-id>
    • 对于 METADATAmetadatalock subresource=<metadata-subresource> classid=<metadatalock-description> dbid=<db-id>
    • 对于 HOBThobtlock hobtid=<hobt-id> subresource=<hobt-subresource> dbid=<db-id>
    • 对于 ALLOCATION_UNITallocunitlock 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-、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 2019 (15.x) 和早期版本需要 VIEW SERVER STATE 权限。

SQL Server 2022 (16.x) 及更高版本以及 SQL Server 和 Azure SQL 托管实例需要 VIEW SERVER PERFORMANCE STATE 对服务器具有权限。

在 Azure SQL 数据库基本S0S1 服务目标上,对于弹性池中的数据库,需要服务器管理员帐户、Microsoft Entra 管理员帐户或服务器角色的成员##MS_ServerStateReader##身份。 对于所有其他 SQL 数据库服务目标,需要数据库的 VIEW DATABASE STATE 权限或 ##MS_ServerStateReader## 服务器角色中的成员身份。

示例

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 AS owt
     INNER JOIN sys.dm_exec_sessions AS es
         ON owt.session_id = es.session_id
     INNER JOIN sys.dm_exec_requests AS er
         ON es.session_id = er.session_id
OUTER APPLY sys.dm_exec_sql_text(er.sql_handle) AS est
OUTER APPLY sys.dm_exec_query_plan(er.plan_handle) AS eqp
WHERE es.is_user_process = 1
ORDER BY owt.session_id;
GO