Max Degree of Parallelism最大並行度配置


由於公司的業務在急速增長中,發現數據庫服務器已經基本撐不住這么多並發。一方面,要求開發人員調整並發架構,利用緩存減少查詢。一方面從數據庫方面改善並發。數據庫的並行度可設置如下:

1)cost threshold for parallelism:數據庫引擎在編譯的時候,預估執行計划的cost;若此cost消耗超過cost threshold for parallelism設置的值;sqlserver就會使用並行執行計划。

2)max degree of parallelism:並行執行計划最多能使用多少線程並行執行語句。默認值為0

 

在OLTP環境中,會存在大量的並發查詢,因此會存在以下兩種情況:

1)單個查詢的並發過高,可能會導致等待並發同步的消耗

若SQL Server中有大量的CXPACKET等待類型,則可能由於是並發過高的原因,CXPACKET等待類型是由於等待一個或多個線程同步,而出現的等待類型。

然而並非說CXPACKET等待類型等待就是不好,我們只是需要減少此等待類型。具體查詢如下

SELECT '查看百分比是否>10%,如果大於10%,考慮降低並行度'    
select cast([signal_wait_time_ms] as decimal(30,2))/[wait_time_ms] as [百分比],*     
from sys.dm_os_wait_stats (nolock)    
where [wait_time_ms]<>0 AND  wait_type='CXPACKET'   

 

2)單個查詢的並發過高,占用大量cpu資源,導致其他線程無法使用

若有許多查詢長期處於Runnable的狀態,則可能是由於並發的影響,其他進程拿不到cpu執行。從而大量線程無法running。具體查詢如下

SELECT '查看cpu任務'    
SELECT scheduler_id, current_tasks_count, runnable_tasks_count    
FROM sys.dm_os_schedulers (nolock)    
WHERE scheduler_id < 255  


如何設置合理的並行度呢?

--配置最大並行度
sp_configure 'max degree of parallelism',1
go
--使設置生效
Reconfigure
go

sp_configure 'cost threshold for parallelism',10--設置為10s
go
--使設置生效
Reconfigure
go

1)在OLTP服務器環境中

a)對並發度要求高,對每個用戶請求都要及時響應,一般建議將max degree of parallelism  設置為1;因此cost threshold for parallelism  的值沒有作用,默認為5即可

b)對並發度要求不高,經常會有復雜查詢的數據庫,若cpu個數<8,一般建議將max degree of parallelism 設置為cpu數量;若cpu個數>=8建議將值設為8;cost threshold for parallelism 默認即可

2)在OLAP服務器環境中

由於查詢均比較復雜,則可將max degree of parallelism 設置為0,同時如果考慮到等待消耗問題,則可以考慮將cost threshold for parallelism 的值設置為10,以降低並發執行的可能

3)在OLTP和OLAP混合環境中

a)對並發度要求高,則可以考慮將max degree of parallelism  設置為<=4,cost threshold for parallelism 值默認即可

b)對並發度要求不高,經常會有復雜查詢的數據庫,若cpu個數<8,一般建議將max degree of parallelism 設置為cpu數量;若cpu個數>=8建議將值設為8;cost threshold for parallelism 默認即可

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM