sys.dm_broker_queue_monitors (Transact-SQL)
适用范围:SQL Server
对于实例中的每个队列监视器,相应地返回一行。 队列监视器负责管理队列的激活。
列名称 | 数据类型 | 描述 |
---|---|---|
database_id |
int | 数据库的对象标识符,该数据库包含了监视器所观察的队列。 Nullable。 |
queue_id |
int | 监视器所观察的队列的对象标识符。 Nullable。 |
state |
nvarchar(32) | 监视器的状态。 Nullable。 此值是以下选项之一:INACTIVE NOTIFIED RECEIVES_OCCURRING |
last_empty_rowset_time |
datetime | RECEIVE 上次从队列返回空结果的时间。 Nullable。 |
last_activated_time |
datetime | 此队列监视器上次激活存储过程时的时间。 Nullable。 |
tasks_waiting |
int | 当前正在等待此队列的语句中的 RECEIVE 会话数。 Nullable。注意: 此数字包括执行 receive 语句的任何会话,无论队列监视器是否启动会话。 这适用于 WAITFOR RECEIVE 与 .. 换句话说,这些任务正在等待消息到达队列。 |
权限
SQL Server 2019 (15.x) 和早期版本需要 VIEW SERVER STATE
对服务器具有权限。
SQL Server 2022 (16.x) 及更高版本需要 VIEW SERVER PERFORMANCE STATE
对服务器具有权限。
示例
A. 当前状态队列监视器
此方案提供了所有消息队列的当前状态。
SELECT DB_NAME() AS [Database_Name],
s.[name] AS [Service_Name],
sch.[name] AS [Schema_Name],
q.[name] AS [Queue_Name],
ISNULL(m.[state], N'Not available') AS [Queue_State],
m.tasks_waiting,
m.last_activated_time,
m.last_empty_rowset_time,
(SELECT COUNT(1)
FROM sys.transmission_queue AS t6
WHERE t6.from_service_name = s.[name]) AS Tran_Message_Count
FROM sys.services AS s
INNER JOIN sys.databases AS d
ON d.database_id = DB_ID()
INNER JOIN sys.service_queues AS q
ON s.service_queue_id = q.[object_id]
INNER JOIN sys.schemas AS sch
ON q.[schema_id] = sch.[schema_id]
LEFT OUTER JOIN sys.dm_broker_queue_monitors AS m
ON q.[object_id] = m.queue_id
AND m.database_id = d.database_id;