[SQL SERVER]內部平行查詢死結特性

查詢單一資料表會生發死結嗎?

大型資料庫效能調校課堂上,我向各位學員說明一個重要觀念,死結發生不一定要有兩個以上資源物件,

單一資源物件只要有兩個以上執行緒發生循環相依時就會發生死結,同時我也告訴大家,

大部分死結都可以有效預防並解決,當然內部平行查詢死結也是可以有效避免,

不過還是要看情況決定,課堂上針對平行執行計畫分析和優化議題上,

我也向大家示範並非所有平行執行計畫就是不好的(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 死結資訊