Поделиться через


sys.dm_broker_queue_monitors (Transact-SQL)

Область применения:SQL Server

Возвращает по одной строке для каждого монитора очереди в экземпляре. Монитор очереди управляет активацией очереди.

Имя столбца Тип данных Нуллибельный Description
database_id int Да Идентификатор объекта для базы данных, содержащей очередь, за которой следит монитор.
queue_id int Да Идентификатор объекта для очереди, за которой следит монитор.
state nvarchar(32) Да Состояние монитора. Это значение является одним из следующих параметров:

INACTIVE
NOTIFIED
RECEIVES_OCCURRING
last_empty_rowset_time datetime Да Последний раз, когда из RECEIVE очереди возвращается пустой результат.
last_activated_time datetime Да Последний раз, когда монитор очереди активировал хранимую процедуру.
tasks_waiting int Да Количество сеансов, ожидающих в данный момент в инструкции RECEIVE для этой очереди.

Заметка: Это значение включает любую сессию, выполняющую оператор получения, независимо от того, запустил ли монитор очереди сессию. Это для того, когда вы используете WAITFOR вместе с RECEIVE. Другими словами, эти задачи ожидают поступления сообщений в очередь.

Разрешения

ДЛЯ SQL Server 2019 (15.x) и более ранних версий требуется VIEW SERVER STATE разрешение на сервере.

ДЛЯ SQL Server 2022 (16.x) и более поздних версий требуется VIEW SERVER PERFORMANCE STATE разрешение на сервере.

Примеры

А. Монитор текущего состояния очереди

Этот сценарий предоставляет сведения о текущем состоянии всех очередей сообщений.

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;