2019年3月30日 星期六

筆記_如何使用SQL Profiler找出死結





一、    問題
當執行SQL指令產生1205ERROR時,我要如何協助AP找到產生deadlockSQL指令?
二、    解決方案
使用SQL Profiler錄製,當死結發生時,SQL Profiler會提供Deadlock Graph提供Deadlock相關資訊。
三、    執行
1.  建立測試資料
建立兩個資料表DATA01DATA02並產生測試資料。
2.  模擬死結發生

SESSION1建立一筆交易,先更新DATA01資料表後的 15秒後才更新DATA02的資料表。

SESSION2建立一筆交易,先更新DATA02資料表後的 15秒後才更新DATA01的資料表。

3.  使用SQL PROFILER錄製死結。

點選LocksDeadlock Graph等事件。

    最後死結發生,SESSION2被當作此次的犧牲者。
   此時SQL PROFILERT偵測到死結產生Deadlock Graph
4.  解讀Deadlock Graph內容
檢視Deadlock Graph做邊藍色打X的部分是被犧牲的SESSION,中間長方形的是被鎖定的Resource,可能是資料表、PAGE或是單一資料列,而左右箭頭代表Resource被取得(Hold)與要求(Request)
  將Deadlock Graph使用XML的格式打開
  可以看到更詳細的資訊,其中最下方的inputbuf代表與死結有關的SQL指令,而deadlock    victim代表被犧牲的SESSION,有時候如果SQL指令太長(例如STORED PROCEDURE)可以使用sqlhandle加上sys.dm_exec_sql_text產出完整的SQL語法。
小結:
當死結發生時可用SQL PROFILER去錄製死結,產生出來的Deadlock Graph可透過圖形或XML的格式取得產生死結的原因,通常inputbuf會顯示產生死結的SQL指令,如果SQL指令太長可以使用sys.dm_exec_sql_text找出完整的SQL指令。



沒有留言:

張貼留言