第十七章——配置SQLServer(1)——為SQLServer配置更多的處理器
前言:
SQLServer提供了一個系統儲存過程,SP_Configure,可以幫助你管理例項級別的配置。微軟建議使用預設配置,但是基於不同的伺服器、不同負載的系統和你的用法,更改配置可能會給你的效能帶來好處。在32位和64位系統中,sp_configure會有一些差異。
我們經常見到SQLServer所在的伺服器上還包含了如IIS、檔案伺服器或者域控制器這些服務或者功能。這些會影響你的效能甚至對正常運作有阻礙作用。
本系列文章將包含:
1、 為SQLServer配置更多的處理器。
配置SQLServer以使用更多的處理器:
今時今日的系統,資料庫變得越來越大。為了更快地從資料庫獲取資訊,僅靠管理你的資料庫並不足夠,還需要更多的CPU來處理。
不管你如何高效地維護索引和統計資訊,你都很難從一個使用低效CPU的SQLServer中獲得足夠好的響應時間。如何選擇合適的CPU用於資料庫的運作不在本系列的範圍之內,但是我們將演示如何使的你的CPU運作得更加強大和有效。
你是否曾經想過SQLServer在執行查詢的時候會使用多少個CPU?使用者經常希望通過購買更多、更快的CPU來加快SQLServer的運作,但是更重要的應該是關注在SQLServer在執行時需要用到多少個?
開始工作:
在開始深入之前,需要了解你的伺服器上有多少個CPU。可以使用一個SQLServer的DMV,sys.dm_os_sys_info來查詢這部分的資訊。這個DMV會嘗試返回關於計算機和關於資源消耗等方面的資訊:
SELECT cpu_count AS 'Cores' ,--邏輯CPU總數
hyperthread_ratio --一個物理CPU的邏輯核心與物理核心的比
FROM sys.dm_os_sys_info
步驟:
1、 為了設定在例項級別上執行查詢時用到的CPU數量,執行下面語句:
--0是預設值
sp_configure 'max degree of parallelism', 0
RECONFIGURE WITH OVERRIDE
GO
2、 從語句級別去設定並行度的值,可以使用hint來實現,下面加上SETSTATISTICS TIME來看看不同的並行度的差異:
SET STATISTICS TIME ON SELECT * FROM Sales.SalesOrderDetail OPTION ( MAXDOP 1 ) SET STATISTICS TIME OFF GO SET STATISTICS TIME ON SELECT * FROM Sales.SalesOrderDetail OPTION ( MAXDOP 0 ) SET STATISTICS TIME OFF GO
下面是截圖:
分析:
SQLServer 有很優秀的演算法體系去決定是否並行執行查詢。改寫SQLServer的決定需要經驗和專業知識。至於使用多少個CPU,這個比較確定的方法就是——試驗。
在步驟1中,使用SP_Configure儲存過程來把最大並行度設為0,也就是預設值,這個值代表這SQLServer是否生成並行執行計劃,如果是,可以使用多少個CPU。如果你設定為4,SQLServer將使用4個核心來處理查詢,如果設為1,就不會發生並行度。
在步驟2中,使用OPTION來對特定查詢設定並行查詢。這裡有兩個SELECT語句同時執行。第一個查詢使用了MAXDOP =1,意味著不使用並行度執行查詢,而第二個查詢使用了MAXDOP =0,意味著由SQLServer自己決定是否使用並行度執行。
在加了SET STATISTICS TIME之後,可以看到每個查詢總共消耗了多少CPU時間。
擴充知識:
在生產環境中更改預設的最大並行度將會非常危險。所以儘可能保持現狀,如果你想修改,需要和你的上司或者同事商討。經驗表明,SQLServer並不總是為了單一查詢而使用所有CPU。除此之外,在OLTP系統中,不建議調整這個設定,但是在OLAP系統中,這卻是可以考慮的。
另外,如果你有16個核心,並把MaxDegree of Parallelism設為8,並不以為這隻有8個核心會用在SQLServer上,僅僅代表單一查詢不會使用超過8個核心而已,即使在並行執行,也如此。但是SQLServer依然會使用所有可用的核心。