查詢單一資料表會生發死結嗎?
大型資料庫效能調校課堂上,我向各位學員說明一個重要觀念,死結發生不一定要有兩個以上資源物件,
單一資源物件只要有兩個以上執行緒發生循環相依時就會發生死結,同時我也告訴大家,
大部分死結都可以有效預防並解決,當然內部平行查詢死結也是可以有效避免,
不過還是要看情況決定,課堂上針對平行執行計畫分析和優化議題上,
我也向大家示範並非所有平行執行計畫就是不好的(SQL2014QO處理平行和其他版本差異),
絕對不是看到平行執行計畫就立馬使用MAXDOP 1來處理,
我們還是需要善用多CPU優勢才能好好發揮SQL SERVER最大效能。
當發生內部查詢平行死結應該是SQL Server parallelism synchronization 程式上的Bug(thread deadlock),
至於內部查詢平行死結有那些特性呢?
1.process list區段中,超過兩個以上不同的process id,卻有相同SPID和SBID。
2.process list區段中,有些process 沒有任何watiresource。
3.resource-list區段中,會出現exchangeEvent或threadpool關鍵字
如何減少內部平行查詢死結
1.改寫查詢SQL(如果可以的話)。
2.針對查詢SQL建立正確Index,減少整體成本(使用 seek),不讓SQL Server使用平行執行計畫。
3.壓抑平行查詢,maxdop=1。
4.多善用try catch(Error 1205 is a deadlock)預防處理死結(如果不幸發生,也不要讓前端系統掛掉)。
參考
[SQL SERVER][Memo]如何解釋 trace flag 死結資訊