sys.dm_os_waiting_tasks (Transact-SQL)

适用于: 是SQL Server(所有支持的版本) 是Azure SQL 数据库 是Azure SQL 托管实例 是Azure Synapse Analytics 是并行数据仓库

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

备注

若要从或调用此 Azure Synapse Analytics 并行数据仓库 ,请使用名称 sys.dm_pdw_nodes_os_waiting_tasks

列名称 数据类型 说明
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 = 由于内部闩锁状态转换而无法确定阻塞闩锁所有者的会话 ID。
blocking_exec_context_id int 正在阻塞的任务的执行上下文 ID。
resource_description nvarchar (3072) 对正在占用的资源的说明。 有关详细信息,请参阅下面的列表。
pdw_node_id int 适用 于: Azure Synapse Analytics 、 并行数据仓库

此分发所在的节点的标识符。

resource_description 列

resource_description 列具有以下可能值。

线程池资源所有者:

  • threadpool id = 计划程序<hex-address>

并行查询资源所有者:

  • exchangeEvent id = {Port |Pipe} <hex-address> WaitType = <exchange-wait-type><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> 可以是:

    • 对于数据库: databaselock subresource = <databaselock-subresource> dbid =<db-id>

    • 对于文件: filelock fileid = <file-id> subresource = <filelock-subresource> dbid =<db-id>

    • 对于 OBJECT: k 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>

    • 对于密钥:键 <hobt-id><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>

    • 对于元数据: k 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-、RangeX-U、RangeX-X

外部资源所有者:

  • External ExternalResource =<wait-type>

常规资源所有者:

  • TransactionMutex TransactionInfo 工作区 =<workspace-id>

  • Mutex

  • CLRTaskJoin

  • CLRMonitorEvent

  • CLRRWLockEvent

  • resourceWait

闩锁资源所有者:

  • <db-id>:<file-id>:<page-in-file>

  • <GUID>

  • <latch-class> (<latch-address>)

权限

在上 SQL Server ,需要 VIEW SERVER STATE 权限。
在 SQL 数据库的基本、S0 和 S1 服务目标上,对于弹性池中的数据库, 服务器管理员 帐户或 Azure Active Directory 管理员 帐户是必需的。 对于所有其他 SQL 数据库服务目标, VIEW DATABASE 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

另请参阅

(Transact-sql 的与操作系统相关的动态管理视图 SQL Server)
线程和任务体系结构指南