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

Откуда:
Сообщений: 12310
Всем привет!

Посоветуйте, как лучше сделать такое. Кастомер жалуется, что у него виснет отчет. Программеры, которые этот отчет писали, не могут сказать ничего внятного. Надо найти хотя бы, какой запрос зависает, потом уже что-то будем решать.

Думаю, что лучше всего запустить профайлер, сделать трейс, который будет сваливать в таблицу все стейтменты - начало и завершение, потом запустить виснущий отчет и спустя какое-то время тормознуть трейс. Посмотреть, какие стейтменты имеют событие started и не имеют completed.

Вопрос 1. Есть ли более удобное решение?
Вопрос 2. В приведенном мной решении как лучше сделать отбор незавершенных событий? Не могу найти поле типа "идентификатор стейтмента". По чему группировку делать - по TextData? Не всегда корректно может получиться.

SQL 2005 SP3.
13 июл 09, 14:29    [7408701]     Ответить | Цитировать Сообщить модератору
 Re: Найти зависший запрос  [new]
flexgen
Member

Откуда: Город на песке
Сообщений: 765
GreenSunrise,

Попробуй выполнить следующий код во время зависания:

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED

SELECT [Spid] = session_Id, ecid, [Database] = DB_NAME(sp.dbid), [User] = nt_username, [Status] = er.status, 
       [Wait] = wait_type, 
       [Individual Query] = SUBSTRING (qt.[text], er.statement_start_offset/2,
                                       (CASE WHEN er.statement_end_offset = -1
	                                         THEN LEN(CONVERT(NVARCHAR(MAX), qt.[text])) * 2
		                                     ELSE er.statement_end_offset END - er.statement_start_offset)/2),[Parent Query] = qt.[text], 
       Program = program_name, Hostname, nt_domain, start_time
FROM sys.dm_exec_requests er
INNER JOIN sys.sysprocesses sp ON er.session_id = sp.spid
CROSS APPLY sys.dm_exec_sql_text(er.sql_handle)as qt
WHERE session_Id > 50              -- Ignore system spids.
AND session_Id NOT IN (@@SPID)     -- Ignore this current statement.
ORDER BY 1, 2
13 июл 09, 14:33    [7408741]     Ответить | Цитировать Сообщить модератору
 Re: Найти зависший запрос  [new]
Crimean
Member

Откуда:
Сообщений: 13148
я обычно для таких случаев включаю стандартные события аудита: существующие коннекты, логин, логоф, рекомпиляции, batch start / complete, rpc start / complete, sp:stmt start / complete и планы запросов. только к такому трасу надо условие ставить, а то и сервер просадите и не все события поймаете и потом в этом искать будете неделю нужные события
можно, конечно, в несколько этапов пойти
сначала только аудит + batch start / complete, rpc start / complete, найти "висюки", понять, что это и потом уже полный трас с планами но с мощными фильтрами и полученное показать разработчикам
13 июл 09, 14:50    [7408920]     Ответить | Цитировать Сообщить модератору
 Re: Найти зависший запрос  [new]
йцу1
Guest
самый быстрый и простой:
создай таблицу
наделай временных меток по ходу выполнения процедуры, и вставляй их в таблицу
13 июл 09, 15:05    [7409045]     Ответить | Цитировать Сообщить модератору
 Re: Найти зависший запрос  [new]
Crimean
Member

Откуда:
Сообщений: 13148
йцу1
самый быстрый и простой:
создай таблицу
наделай временных меток по ходу выполнения процедуры, и вставляй их в таблицу



действительно, перехерачить исходники куда проще, чем запустить профайлер
13 июл 09, 16:26    [7409634]     Ответить | Цитировать Сообщить модератору
 Re: Найти зависший запрос  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
попробуйте отловить запрос с большим временем исполнения
как найдете ,так патом уж чего и мучайте
-------------------------------------
Jedem Das Seine
13 июл 09, 16:47    [7409809]     Ответить | Цитировать Сообщить модератору
 Re: Найти зависший запрос  [new]
Александр Волок (def1983)
Member

Откуда: Rotterdam
Сообщений: 4959
1) Запросы просто так не виснут.. Если пользователи ждут результат, значит сам сервер еще колбасит, возможно ожидая какой-то ресурс (ожидание снятия блокировки сюда же)

2) Как следствие предыдущего пункта: Выполняющие запросы всегда можно отловить с помощью DMV
Могу посоветовать отличный скрипт. Показывает какие активные запросы, сколько ресурсов уже скушали, сам запрос, а также его план.

Если же пользователи говорят что "висит", а никаких подходящих активных сессий нет, значит проблема зависания отчета не в SQL Server.
13 июл 09, 16:56    [7409906]     Ответить | Цитировать Сообщить модератору
 Re: Найти зависший запрос  [new]
GreenSunrise
Member

Откуда:
Сообщений: 12310
2flexgen: спасибо, попробую!

2Crimean: речь идет как раз о том, чтобы эти висюки найти. Планы и оптимизация - потом. Пока неясно даже, на каких запросах виснет.

2йцу1: да там даже не процедура может оказаться, а набор ad-hoc queries в коде приложения. Там метки не сильно-то поставишь.

2Maxx: "виснет" - в данном случае не завершается за 2 часа. Поэтому о времени выполнения речь как раз не идет - нету его, этого времени выполнения для недовыполненного запроса.

2Александр Волок (def1983): блокировок в момент зависания нет, проверяли через sp_lock. Все ресурсы granted. Сессии активные есть. За ссылку спасибо, посмотрю!
13 июл 09, 21:31    [7410849]     Ответить | Цитировать Сообщить модератору
 Re: Найти зависший запрос  [new]
Crimean
Member

Откуда:
Сообщений: 13148
так предложение и было найти batch / rpc / statement, которые в пределах одного spid начинаются, но не заканчиваются
14 июл 09, 10:34    [7411969]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить