Оператор SQl для мониторинга блокировок сервера Sql - PullRequest
0 голосов
/ 13 июля 2010

Какое предложение SQL (функция или хранимая процедура) я могу использовать для наблюдения за блокировкой SQL Server, вызванной оператором UPDATE?

Ответы [ 3 ]

3 голосов
/ 13 июля 2010

попробуйте этот запрос, чтобы увидеть процессы блокировки, включая фактический текст запроса SQL:

SELECT
    r.session_id AS spid
        ,r.cpu_time,r.reads,r.writes,r.logical_reads 
        ,r.blocking_session_id AS BlockingSPID
        ,LEFT(OBJECT_NAME(st.objectid, st.dbid),50) AS ShortObjectName
        ,LEFT(DB_NAME(r.database_id),50) AS DatabaseName
        ,s.program_name
        ,s.login_name
        ,OBJECT_NAME(st.objectid, st.dbid) AS ObjectName
        ,SUBSTRING(st.text, (r.statement_start_offset/2)+1,( (CASE r.statement_end_offset
                                                                  WHEN -1 THEN DATALENGTH(st.text)
                                                                  ELSE r.statement_end_offset
                                                              END - r.statement_start_offset
                                                             )/2
                                                           ) + 1
                  ) AS SQLText
    FROM sys.dm_exec_requests                          r
        JOIN sys.dm_exec_sessions                      s ON r.session_id = s.session_id
        CROSS APPLY sys.dm_exec_sql_text (sql_handle) st
    --WHERE r.session_id!=@@SPID --uncomment to not see this query

тупики легко перехватываются с помощью профилировщика:

Попробуйте запустить трассировку в профилировщике(выберите пустой шаблон), выберите «событие графика взаимоблокировки» и на новой появившейся вкладке («Настройки извлечения событий») сохраните каждое (отметьте «сохранять события XML взаимоблокировки отдельно») в своем собственном файле.Откройте этот файл в программе просмотра XML, и вам будет легко узнать, что происходит.Содержится каждый процесс со стеком выполнения вызовов процедур / триггеров и т. Д. И т. Д., И все блокировки также присутствуют.

Посмотрите на раздел «список ресурсов» файла, он покажет, чтоблокируется и удерживается каждым процессом, вызывающим тупик.Выясните, как не заблокировать один из них, и взаимоблокировка будет устранена.

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

2 голосов
/ 13 июля 2010

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

0 голосов
/ 13 июля 2010
SELECT * FROM sys.dm_exec_requests WHERE blocking_session_id <> 0

Но это покажет вам запросы, которые блокируются, что является нормальным для SQL Server и не указывает на тупик.Если SQL Server обнаружит взаимоблокировку, он завершит один из процессов, чтобы остальные могли продолжить.Таким образом, вы не можете использовать функцию или хранимую процедуру для мониторинга этого, поскольку к тому времени, когда это происходит, оно уже завершено.

Вы можете использовать SQL Profiler или Флаги трассировки

...