[SQL SERVER][Performance]注意不正當平行處理

[SQL SERVER][Performance]注意不正當平行處理

CPU Bottleneck一文中有探討平行處理,NUMA架構中要小心跨節點不正當平行處理所帶來的問題,

以及OLTP存在很多小量查詢或交易時,使用平行化處理反而會影響效能(降低吞吐量)。

image

 

問題描述:
我有一隻Job,每月第一天會滾上一個月全公司出缺勤刷卡紀錄並計算加班工時和異常次數,每月資料大約23000筆也沒有很多
前面幾個月這隻Job平均執行時間約35~40sec,但10月查看這支Job完成時間卻暴增約6~8分鐘才完成(處理9月資料),

於是我把正式環境這隻SP搬到測試環境執行並觀察SQLServer到底在等什麼(waittype)

image

可以看到都是自己block自己,而且都在等待取得資料列資源(雖然看到等待時間都很短暫)。

 

查看該SP內容看到MAXDOP 16誤設,我前面有說過NUMA架構中,MAXDOP數量應該是每一個NUMA節點最小可用CPU數量,

我這裡每節點最小可用CPU數量為8,所以修改MAXDOP 8就OK,至於為什麼會設為16,

可能是前一個禮拜再測試效能的時候忘記改回來(下面簡單附上當初測試的紀錄)。

image  

 

CPU

image

 

 

測試MAXDOP效能

maxdop 1 CPU 時間 = 81245 ms,經過時間 = 92125 ms。
maxdop 8 CPU 時間 = 54794 ms,經過時間 = 51309 ms。
maxdop 16 CPU 時間 = 76205 ms,經過時間 = 49769 ms。

 

 

參考

CPU Bottleneck