Уведомление о длительном запросе или взаимоблокировке в SQL Server 2008 R2?

15

Я хотел бы знать, есть ли способ отправить уведомление в тупик? Если так, какие запросы потребуются. Я понимаю, что SQL Server заботится о взаимоблокировках, мне просто нужна информация о задействованных запросах.

Я нашел следующее, чтобы определить длительные запросы:

SELECT 
    creation_time
    ,last_execution_time
    ,total_physical_reads
    ,total_logical_reads
    ,total_logical_writes
    , execution_count
    , total_worker_time
    , total_elapsed_time
    , total_elapsed_time / execution_count avg_elapsed_time
    ,SUBSTRING(st.text, (qs.statement_start_offset/2) + 1,
    ((CASE statement_end_offset
        WHEN -1 THEN DATALENGTH(st.text)
        ELSE qs.statement_end_offset END
    - qs.statement_start_offset)/2) + 1) AS statement_text
FROM sys.dm_exec_query_stats AS qs
    CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) st  
where total_elapsed_time >= 300000000 --5 min
ORDER BY total_elapsed_time / execution_count DESC; 

Я хотел бы знать, является ли приведенный выше подход верным, или есть лучший способ определить, занимает ли какой-либо запрос больше определенного интервала, скажем 5 минут, как показано?

Благодарность

Hasanain
источник

Ответы:

8

В SQL 2008 появилась новая функция, которую можно использовать для взаимоблокировок и длинных очередей: расширенные события . Расширенные события являются объектами низкого уровня и потребляют гораздо меньше ресурсов, чем другие методы, такие как профилирование / трассировка, оповещения и т. Д.

Для использования расширенных событий с deadlocksэтим постом следует Джонатан Кехайяс , MVP SQL-сервера.

Чтобы использовать расширенные события для поиска long running queries, ознакомьтесь с этим подробным сообщением Пинала Дейва , другого MVP-сервера SQL.

StanleyJohns
источник
10

Вы можете настроить оповещения для обоих из них с агентом SQL. Создайте новое предупреждение и выберите тип «Предупреждение о состоянии производительности SQL Server»

Для длительных запросов выберите Объект «MSSQL $ InstanceName: Транзакции» и «Счетчик: Время выполнения самой длинной транзакции». Сконфигурируйте значения и параметры оповещения, и все готово.

Для взаимоблокировок Объект - «MSSQL $ InstanceName: Locks», а Счетчик - «Количество тупиков / сек».

Если вы хотите более детальный контроль над уведомлением о взаимоблокировке, проверьте это: http://www.sqlservercentral.com/articles/Administration/3243/

Сорок девять
источник
Я попытался настроить предупреждение, как вы предложили, однако задание будет запущено только при наличии определенных шагов. Есть ли способ настроить оповещение без определения рабочих шагов?
Хасанаин
4

Я бы предпочел предложение @StanleyJohns, если у вас SQL2008. Расширенные мероприятия, с которыми стоит ознакомиться в качестве диагностического инструмента, и серия Jonathon An XEvent a Day - отличное место для начала.

Альтернативой для взаимоблокировок является включение флагов трассировки 1204 и 1222 , которые сбрасывают информацию о взаимоблокировках в журнал ошибок SQL. Включите оба варианта, чтобы получить информацию в двух разных форматах, что облегчит понимание сложных цепочек взаимоблокировок.

Марк Стори-Смит
источник