在通常情況下,SQL
Server資料庫在執行查詢作業的時候,都是單線程操作的。不夠資料庫為了應對比較大流量的查詢作業,故SQL Server提供了並行查詢的功能。
並行查詢其優勢就是可以通過多個線程來處理查詢作業,從而提高查詢的效率。SQL
Server資料庫為具有多個CPU的資料庫伺服器提供並行查詢的功能,以最佳化查詢作業的效能。也就是說,只要資料庫伺服器有多個CPU,則資料庫系統就可以使用多個作業系統進程並存執行查詢操作,來加速完成查詢作業。
一、並行查詢三步走。
並行查詢作業在資料庫中,主要經過三個步驟。
首先,資料庫會判斷是否需要進行並行查詢。在資料庫中有一個查詢最佳化工具,會對SQL語句進行最佳化,然後資料庫才會去執行查詢語句。而這個查詢器在對SQL語句進行查詢最佳化時,其中一個動作就是判斷是否需要對SQL語句進行查詢最佳化。也就是說,並不是所有的SQL查詢語句都可以從並行查詢中擷取收益。如果查詢最佳化工具認為查詢語句可以從並行查詢中擷取收益的話,則就會將交換運算子插入到查詢執行計畫中,為並行查詢做準備。故哪些語句需要採用並行查詢,哪些不需要,這不用資料庫管理員關心。資料庫查詢最佳化工具會幫管理員作出這個決定。資料庫管理員需要清楚的是,在哪些情況下,資料庫SQL最佳化器會認為不宜採用並行查詢。通常情況下,只要滿足以下條件的任何一個,則就不會執行並行查詢。一是對於特定的查詢,查詢最佳化工具認為串列查詢執行計畫要快於任何可能的並存執行計劃;二是查詢的串列執行成本並不高,不需要進行並行查詢;三是查詢中包含無法並行啟動並執行標量運算子或者關係運算子。若從資料庫管理員的角度講,第三個條件對我們具有最大的影響。當資料庫預計未來可能利用並行查詢來提高資料庫效能時,則在資料庫設計時,就需要注意避免使用那些無法在並行查詢功能中使用的運算子。因為某些關係運算子或者邏輯運算子可能會要求查詢計劃一定要在串列模式中進行,或者部分需要在串列模式下進行。如此的話,查詢最佳化工具就不會利用並行查詢功能來提高查詢語句的效能。這是資料庫管理員在資料庫設計時必須要考慮到的一個細節問題。
其次,確定並行的進程數。當查詢最佳化工具在查詢語句中插入交叉運算子之後,資料庫就會執行並行查詢。並行查詢在執行計畫時可以使用多個線程。此時,就又遇到了一個問題,資料庫會把這個查詢作業分成幾個進程操作呢?此時,資料庫管理員就需要知道上什麼叫做並行度。其實。在處理並行查詢的時候,資料需要知道最大可使用的進程與實際使用的進程。而最大可使用的進程就叫做並行度。這個並行度的值是在伺服器層級中進行設定,也可以通過系統預存程序來進行修改。但是,最大可使用進程數不一定等於實際是用進程數。實際是用進程數是資料庫在查詢計劃執行時初始化的時候確定的。也就是說,這不用資料庫管理員去額外的設定。資料庫系統會自動根據計劃的複雜程度來確定合理的進程數目。當然其實際採用的進程數不能夠超過並行度,即最大可以使用的進程數。
最後執行查詢。當以上內容確定好之後,資料庫就會執行具體的查詢語句。在這一步中,需要注意一個問題。資料庫管理員還可以在查詢語句中指定MAXDOP查詢提示來修改這個進度值。也就是說,如果某個查詢作業資料庫管理員認為可能會耗時比較久,就可以為這個查詢作業設定比較大的進度值。當利用MAXDOP查詢提示設定這個並行進度值之後,它會覆蓋預先設定的預設值。從而實現針對單個查詢語句設定額外的進度值,以提高某些特殊查詢作業的效能。
二、並行查詢中需要注意的內容。
注意點一:需要注意硬體方面的限制。
並行查詢是資料庫提高查詢效能的一個有力舉措。不過其往往受到比較大的約束。如上面提高的一些基於成本考慮之外,還有一些硬性的限制。如通常情況下,只有在資料庫伺服器有多個微處理器(CPU
)的情況下資料庫才會考慮執行並行查詢。也就是受,只有具有多個CPU的電腦才能夠使用並行查詢。這是一個硬性的限制條件。另外在查詢計劃執行過程中,資料庫還會判斷當時是否有足夠多的線程可以使用。每個查詢操作都要求一定的線程數才能夠執行;而且執行並行計劃比執行串列計劃需要更多的線程,所需要的線程數也會隨著並行度的提高而提高。如果在並行計劃執行的時候,當時資料庫伺服器沒有足夠的線程讓並行計劃使用的話,資料庫引擎就會自動減少並行度,甚至會放棄並行查詢而改為串列計劃。所以說,資料庫是否能夠執行並行查詢,要受到其硬體的限制。為此,如果企業真的需要通過並行查詢來提高資料庫效能的話,則管理員就需要根據情況來調整硬體設定。
注意點二:不建議對所有查詢都使用並行查詢。
通常情況下,筆者認為最好只對大型表的串連查詢、大量資料的彙總操作、大型結果集的重複排序等等操作才應用並行查詢的功能。如果在這些操作上執行並行查詢的話,那麼其改善資料庫效能的效果是非常明顯的。相反,如果對於簡單查詢執行並行查詢的話,可能執行並行查詢所需要的額外協調工作會大於其潛在的效能提升。所以,資料庫管理員在確定是否需要執行並行查詢功能的話,需要謹慎。筆者的建議是,在資料庫伺服器層級上,最好不要設定並行查詢。即把並行度設定為1或者一個比較小的值。然後對於一些特殊的查詢操作,利用MAXDOP查詢提示來設定最大的可使用進程數。如此的話,可能會更加的合理。如果有時候資料庫管理員不知道是否需要採用並行查詢功能的話,則可以通過資料庫內建的統計功能進行判斷。為了區別並行查詢計劃到底有沒有從並行查詢中受益,資料庫引擎可以將執行查詢的估計開銷與並行查詢的開銷閥值進行比較。並行計劃只有對需時較長的查詢通常更加有益;因為其效能優勢將抵消初始化、同步和終止並行計劃所需的額外時間開銷。
注意點三:資料庫會根據查詢所涉及到的行數來判斷是否要並行查詢。
上面談到,最好對大型表的串連查詢、大量資料的彙總操作、大型結果集的重複排序等等操作才應用並行查詢的功能。因為只有如此,並行查詢帶來的收益才會超過其付出的代價。但是,並不是說串連查詢、彙總操作、排序等作業都適合採用並行查詢。當資料庫在考慮並行查詢計劃的時候,查詢最佳化工具還會去確定所涉及到的行數。如果所涉及到的行數台少,則將不會考慮執行並行查詢計劃。而會採用串列方式執行查詢語句。如此的話,可以避免因為啟動、分發、協調的開銷大大超過並存執行作業所帶來的收益。這本來是一個不錯的設計,但是也會給資料庫管理員帶來一定的麻煩。如現在資料庫管理員想要測試並行查詢到底可以在多大程度上影響查詢操作,就有點麻煩。因為其有資料量的限制。如果資料庫管理員需要進行這個測試,還不得不先在資料庫系統中匯入足夠多的資料才行。這就限制了資料庫管理員的測試操作。不過話說回來,這個機制仍然是不錯的。因為資料庫管理員不用去考慮,當資料庫規模到多大的時候採用並行查詢。
注意點四:同一個操作在不同時候會採用不同的進程數。
上面說到過,並行查詢到第採用多少進程數除了跟操作的複雜程度相關外,還直接跟當時的伺服器狀態相關,如是否有足夠的進程數等等。所以,在不同的時間,即使是相同的資料、相同的操作,其並行查詢所用的進程數也可能不同。其所需要的時間也就不同了。因為只有在並行查詢真正進行的時候,資料庫引擎才去收集當前系統的工作負載,如進程數,和其他對一些配置資訊,然後資料庫才確定最佳的並行進程數。從查詢開始,到這個查詢作業結束,將一直採用這個進程數。如果下次要繼續查詢,則資料庫引擎會繼續收集這些資訊。此時,如果系統工作負載有所改善,在資料庫可能會採用更多的進程數來執行這個查詢。從而查詢作業的效能會更加的高。相反,如果此時系統的負荷比前一次查詢要重了,則資料庫就可能會採用比較少的進程來處理這個作業。此時,第二次查詢的速度反而更慢了。所以,如果在資料庫伺服器中同時部署了其他應用,則其他應用所佔用系統資源的多少也會對並存執行產生難以估測的影響。
Microsoft SQL Server 可以自動並存執行查詢。從而最佳化多處理器電腦中的查詢執行。不是使用一個 OS 線程執行一個查詢,而是將工作劃分為多個線程,複雜查詢可以更快、更有效地完成。
最佳化程式產生查詢計劃,並決定何時將並存執行查詢。當進行決策時,它考慮以下事項:
·電腦有多個處理器嗎?
·可用記憶體足以並存執行查詢嗎?
·伺服器上的 CPU 負荷怎樣?
·正在運行哪種類型的查詢?
當允許 SQL Server 運行並行操作(如並行 DBCC 和索引建立)時,伺服器資源變得緊張,當發生大量並行操作時會看到警告訊息。
當伺服器上有活動使用者時請不要運行大量的並存執行的查詢。
嘗試在卸載期間執行 DBCC 和 INDEX 建立等維護作業。這些作業可以並存執行。
監視磁碟 I/O 效能。在效能監控器中觀察磁碟隊列長度,以進行升級硬碟或將資料庫重新分發到不同磁碟上的決策。
如果 CPU 使用較高,請升級或添加更多的處理器。
影響並行查詢的配置設定
以下伺服器配置可能影響查詢的並存執行:
·並行性的成本域值
·最大並行度
·最大背景工作執行緒
·查詢管理員成本限制