sys.dm_os_workers (Transact-SQL)

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

对于系统中的每个工作线程,相应地返回一行。 有关工作线程的详细信息,请参阅线程和任务体系结构指南

注意

若要从 Azure Synapse Analytics 或 Analytics Platform System (PDW) 调用它,请使用名称 sys.dm_pdw_nodes_os_workers。 Azure Synapse Analytics 中的无服务器 SQL 池不支持此语法。

列名称 数据类型 说明
worker_address varbinary(8) 工作线程的内存地址。
状态 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 = 工作线程当前正在运行挂起 I/O 的 I/O 完成例程。 有关详细信息,请参阅 sys.dm_io_pending_io_requests (Transact-SQL)
context_switch_count int 此工作线程所执行的计划程序上下文切换数。
pending_io_count int 此工作线程执行的物理 I/O 数。
pending_io_byte_count bigint 此工作线程的所有挂起的物理 I/O 的字节总数。
pending_io_byte_average int 此工作线程的物理 I/O 的平均字节数。
wait_started_ms_ticks bigint 此工作线程进入 SUSPENDED 状态时 ms_ticks 中的时间点。 从 sys.dm_os_sys_info 中的 ms_ticks 中减去此值后将返回工作线程已经等待的毫秒数。
wait_resumed_ms_ticks bigint 此工作线程进入 RUNNABLE 状态时 ms_ticks 中的时间点。 从 sys.dm_os_sys_info 中的 ms_ticks 中减去此值后将返回工作线程已在可运行队列中的毫秒数。
task_bound_ms_ticks bigint 任务绑定到此工作线程时 ms_ticks 中的时间点。
worker_created_ms_ticks bigint 工作线程创建时 ms_ticks 中的时间点。
exception_num int 此工作线程遇到的上一个异常的错误号。
exception_severity int 此工作线程遇到的上一个异常的严重性。
exception_address varbinary(8) 出现异常的代码地址
affinity bigint 工作线程的线程关联。 与 sys.dm_os_threads (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 (Transact-SQL)
memory_object_address varbinary(8) 工作线程内存对象的内存地址。 有关详细信息,请参阅 sys.dm_os_memory_objects (Transact-SQL)
thread_address varbinary(8) 与此工作线程关联的线程的内存地址。 有关详细信息,请参阅 sys.dm_os_threads (Transact-SQL)
signal_worker_address varbinary(8) 最后一个向此对象发出信号的工作线程的内存地址。 有关详细信息,请参阅 sys.dm_os_workers
scheduler_address varbinary(8) 计划程序的内存地址。 有关详细信息,请参阅 sys.dm_os_schedulers (Transact-SQL)
processor_group smallint 存储分配给此线程的处理器组 ID。
pdw_node_id int 适用于:Azure Synapse Analytics、Analytics Platform System (PDW)

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

备注

如果工作线程的状态是 RUNNING 并且工作线程正在以非抢先方式运行,则工作线程地址将与 sys.dm_os_schedulers 中的 active_worker_address 进行匹配。

当等待事件的工作线程得到信号时,工作线程将被放在可运行队列的开头。 SQL Server 允许这种情况在行中发生一千次,在此之后工作线程将被放在队列的末尾。 将工作线程移动到队列末尾会对性能有某些潜在影响。

权限

在 SQL Server 上,需要 VIEW SERVER STATE 权限。
在 SQL 数据库 Premium 层上,需要在数据库中拥有 VIEW DATABASE STATE 权限。 在 SQL 数据库 Standard 和 Basic 层上,需要 Server Admin 角色成员身份或 Azure Active Directory admin 帐户。

SQL Server 2022 及更高版本的权限

需要对服务器具有 VIEW SERVER PERFORMANCE 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_runnablew_suspended 相等时,它代表工作线程处于 SUSPENDED 状态下的时间。 否则,w_runnable 代表工作线程处于 RUNNABLE 状态下的时间。 在输出中,会话 52 处于 SUSPENDED 状态下的时间为 35,094 毫秒。

另请参阅

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