Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Интересный вопрос  [new]
andrew shalaev
Member

Откуда: Moscow
Сообщений: 610
Доброго времени суток, был недавно на собеседовании и не смог ответить на такой вопрос:

Имеем необходимость постоянно отслеживать тяжелые запросы продолжительностью более 10 сек. Т.е. система мониторинга должна отлавливать такие запросы(тело запроса) и пересылать мне их на мыло.

Например такой запрос выведет такие запросы по БД Test:


select
qs.total_elapsed_time/1000000 as 'TotDuration(sec)',
db_name(st.dbid)as database_name,
case
when sql_handle IS NULL then ' '
else(substring(st.text,(qs.statement_start_offset+2)/2,(
case
when qs.statement_end_offset =-1 then len(convert(nvarchar(MAX),st.text))*2
else qs.statement_end_offset
end - qs.statement_start_offset)/2 ))
end as query_text

from sys.dm_exec_query_stats qs
cross apply sys.dm_exec_sql_text(sql_handle) st
where qs.total_elapsed_time > 1000000 and db_name(st.dbid) like 'Test'


Я предположил что можно записывать данный запрос в таблицу и запихнуть его в джоб, который периодически запускаться.
Можно еще постоянно иметь запущенной трассу профайлера, с настроенным фильтром.
Или еще смотреть монитор активности

Но эти варианты не правильны, какими еще способами можно получить данную информацию?
6 дек 11, 17:45    [11715367]     Ответить | Цитировать Сообщить модератору
 Re: Интересный вопрос  [new]
TungusXan
Member

Откуда: Хочу туда где нет труда и каждый день зарплата! =)
Сообщений: 1686
SELECT *
FROM master.dbo.sysprocesses
WHERE waittime >= 10000
6 дек 11, 19:18    [11716197]     Ответить | Цитировать Сообщить модератору
 Re: Интересный вопрос  [new]
TungusXan
Member

Откуда: Хочу туда где нет труда и каждый день зарплата! =)
Сообщений: 1686
TungusXan
SELECT *
FROM master.dbo.sysprocesses
WHERE waittime >= 10000


Сори! Не прочитал внимательно... Но имхо логично все таки джоб с отправкой уведомлений...
6 дек 11, 19:21    [11716216]     Ответить | Цитировать Сообщить модератору
 Re: Интересный вопрос  [new]
andrew shalaev
Member

Откуда: Moscow
Сообщений: 610
TungusXan,

С джобом не логично, т.к. не будешь же его запускать каждую секунду(или 10 сек). Как я понимаю T-sql код возвращает тяжелые запросы на текущий момент времени.
6 дек 11, 20:53    [11716860]     Ответить | Цитировать Сообщить модератору
 Re: Интересный вопрос  [new]
Deniro
Member

Откуда: град Подмосковье
Сообщений: 84
andrew shalaev

Если задача стоит отследить ВСЕ запросы, то джоб не пойдет - вы можете что-то и пропустить, ведь указанное вами системное представление отражает только закэшированные планы запросов. Поэтому если план запроса сбросится из кэша, а вы его не успеете отмониторить джобом, то будет пропуск в мониторинге.
Чтобы все отловить - возможно либо трассировкой на стороне сервера (как менее нагруженное, чем с клиента), либо Event Notifications использовать.
7 дек 11, 09:38    [11718839]     Ответить | Цитировать Сообщить модератору
 Re: Интересный вопрос  [new]
andrew shalaev
Member

Откуда: Moscow
Сообщений: 610
Deniro,

В принципе можно сделать alert который будет отслеживать продожительность запросов, и на его срабатывание повесить джоб с приведенным выше запросом. Только какой счетчик повесить на alert, SQL server:SQL statistic\SQL compilations /sec он отображает продолжительность выполнения запросов?
7 дек 11, 11:56    [11719870]     Ответить | Цитировать Сообщить модератору
 Re: Интересный вопрос  [new]
Prolog
Member

Откуда: Москва
Сообщений: 2793
Создает хранимыми процедурами трайс на события SP:StmpCompleted и SQL:StmpCompleted с фильтром Duration >= 10 секунд с записью событий в таблицу базы данных. Ну, а как мониторить эту таблицу и отправлять письма - дело техники. Мне кажется, вполне достаточно иметь такой список для анализа, а чтобы прям сразу получать письмо - это лишнее.
7 дек 11, 12:33    [11720283]     Ответить | Цитировать Сообщить модератору
 Re: Интересный вопрос  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
Вот вариант: Blocked Process Report
Настраиваем:
sp_configure 'blocked process threshold', 10; -- 10 Секунд
GO
RECONFIGURE;
GO
Вешаем:
CREATE EVENT NOTIFICATION [NEventLog] ON SERVER
FOR DEADLOCK_GRAPH, BLOCKED_PROCESS_REPORT
--FOR TRC_LOCKS, BLOCKED_PROCESS_REPORT
TO SERVICE 'SEventLog','current database';
GO
Ну и кумпологязэ, очереди, процедуру обработки и руты не забыть настроить.
7 дек 11, 13:01    [11720549]     Ответить | Цитировать Сообщить модератору
 Re: Интересный вопрос  [new]
mike909
Member

Откуда:
Сообщений: 662
Mnior,

andrew shalaev
Имеем необходимость постоянно отслеживать тяжелые запросы продолжительностью более 10 сек. Т.е. система мониторинга должна отлавливать такие запросы(тело запроса) и пересылать мне их на мыло.

Требуется время выполнения более 10 сек, а не время блокировки более 10 сек.

Хотя Ваш ответ навел меня на интересное решение следующей задачи:
Нужно сгенерить alarm если кол-во блокированных запросов более заданной константы в течении заданного времени.
+ Т.е. как Вы и предлагаете

Mnior
Вот вариант: Blocked Process Report
Настраиваем:
sp_configure 'blocked process threshold', 10; -- 10 Секунд
GO
RECONFIGURE;
GO
Вешаем:
CREATE EVENT NOTIFICATION [NEventLog] ON SERVER
FOR DEADLOCK_GRAPH, BLOCKED_PROCESS_REPORT
--FOR TRC_LOCKS, BLOCKED_PROCESS_REPORT
TO SERVICE 'SEventLog','current database';
GO
Ну и кумпологязэ, очереди, процедуру обработки и руты не забыть настроить.


А в Reader_е SB
declare @Cnt int, @Timeout int, @MsgType sysname
set @Timeout = 10000 -- Заданный интервал
while 1=1
begin
  set @MsgType = NULL
  WAITFOR( RECEIVE ... ) , TIMEOUT @Timeout

  if @MsgType is NULL -- TimeOut expired
    BREAK;
/*
Ну и соответственно ловим и подсчитываем EVENT_INCTANCE_BLOCKED_PROCESS_REPORT, уменьшая @Timeout.
В случае превышения @Cnt заданного кол-ва - генерим alarm.
*/
end;

Соответственно - если Reader вылетит по TimeOut_у, то условия для alarm_а так и не наступили (вот и славненько).
Есть, конечно, вероятность того, что я с таким алгоритмом пропущу плавное наростание и затем небольшой всплеск, который может и соответствует условиям alarm_а, но как правило такого не бывает. Ну а если и бывает, то может и к лучшему - игнорирование таких ситуаций.
7 дек 11, 14:30    [11721686]     Ответить | Цитировать Сообщить модератору
 Re: Интересный вопрос  [new]
Deniro
Member

Откуда: град Подмосковье
Сообщений: 84
andrew shalaev
Deniro,

В принципе можно сделать alert который будет отслеживать продожительность запросов, и на его срабатывание повесить джоб с приведенным выше запросом. Только какой счетчик повесить на alert, SQL server:SQL statistic\SQL compilations /sec он отображает продолжительность выполнения запросов?


На сколько я знаю, счетчик SQL server:SQL statistic\SQL compilations /sec показывает количество компиляций в секунду. Отношения к длительности запросов он не имеет. И счетчиками вы продолжительность конкретных запросов не отследите. Счетчики предназначены для измерения общего Performance по сиквелу/ресурсам.
Хороший вариант мониторинга подсказывает еще Prolog вам.
7 дек 11, 17:05    [11723546]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить