sys.dm_os_workers (Transact-SQL)
适用于:SQL Server
Azure SQL 数据库
Azure SQL 托管实例
Azure Synapse Analytics
Analytics Platform System (PDW)
对于系统中的每个工作线程,相应地返回一行。 有关工作线程的详细信息,请参阅线程和任务体系结构指南。
注意
若要从 Azure Synapse Analytics 或 Analytics Platform System (PDW) 调用它,请使用名称 sys.dm_pdw_nodes_os_workers。 Azure Synapse Analytics 中的无服务器 SQL 池不支持此语法。
列名称 | 数据类型 | 描述 |
---|---|---|
worker_address | varbinary(8) | 工作线程的内存地址。 |
status | 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) | 出现异常的代码地址 |
关联 | 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_runnable
和 w_suspended
相等时,它代表工作线程处于 SUSPENDED 状态下的时间。 否则,w_runnable
代表工作线程处于 RUNNABLE 状态下的时间。 在输出中,会话 52
处于 SUSPENDED
状态下的时间为 35,094
毫秒。
另请参阅
与 SQL Server 操作系统相关的动态管理视图 (Transact-SQL)
查询处理体系结构指南
线程和任务体系结构指南