Oracle並行操作——淺議使用並行的時機

realkid4發表於2011-05-25

 

宣告:本篇部分內容參考《Oracle並行SQL指南》,特此感謝!

 

相對於我們經常使用的Oracle最佳化技術,並行操作是一種很特殊的選擇。恰當合理、有選擇的對一些SQL語句進行並行化處理,可以有針對性的提升系統一些關鍵業務場景的執行效率。但是,另一方面,如果使用並行過多過濫,甚至處處並行,那麼可能引起伺服器整體過載的現象。

 

那麼,我們如何判斷此時應該進行並行化處理?如何得知哪個時候可以使用並行呢?

 

1、影響並行因素分析

 

並行技術是一種軟硬體綜合技術。硬體方面的基礎就是多CPU系統的普及和廣泛應用,多磁碟IO負載分割。硬體方面的提升為並行技術的實現提供了物質上的基礎,多個CPU可以真正的同時完成任務。軟體方面的並行基礎就是並行演算法研究的成熟,一個任務如何分解,分解子任務如何進行溝通、合併等等。軟體方面重新實現了一套演算法體系,支援了系統平行計算的實現。

 

 

那麼,我們的並行操作決策受到哪些因素作用和影響呢?

 

 

ü        伺服器CPU個數和運算能力

 

相對於如索引、聚簇表等邏輯最佳化手段,並行操作是一種硬體條件強依賴的最佳化手段。其中,CPU的個數是並行操作效果的決定因素。如果資料庫伺服器擁有多個CPU,那麼採用並行操作的效果就會更好。反之,如果伺服器只有一塊CPU,設定的SQL又要求一個很高的並行度指標,那麼並行程式之間爭用CPU的現象會很多,反而影響到並行整體效能。

 

 

作為企業級應用,部署的資料庫伺服器硬體條件應該是有一定水準的。隨著多核CPU和多CPU伺服器的普及,並行操作的硬體條件會慢慢不再成為瓶頸所在。

 

 

ü        資料儲存的分散性

 

通常情況下,Oracle服務程式Server Process獲取一個資料塊,首先是從快取記憶體Buffer Cache中嘗試獲取對應的塊。當沒能尋找到資料塊時,就直接從磁碟上將資料塊獲取到Buffer Cache中,之後再進行寫入等操作。

 

但是,並行操作的方式卻有所不同。並行操作是多個Process程式在訪問相同的一批資料,如果全部按照Buffer Cache,後磁碟的順序進行操作,很容易造成資料塊爭用和等待。所以,通常的並行操作都是直接針對磁碟上的資料檔案進行讀寫。那麼,如果我們的資料分散度較好,就可以很大程度上避免爭用現象。

 

 

另一方面,資料庫儲存結構越來越獨立化。專門的磁碟陣列機的出現,使得資料庫IO能力提高。將資料檔案分散在多個磁碟上,進行分散的IO操作和CPU執行操作,是一個發展方向。

 

 

ü        特定SQL考慮使用並行

 

並行操作通常不是我們的本能選擇,也不會是我們的本能選擇。因為並行操作本身涉及到的範圍很廣,包括軟硬體的協調、資料庫引數的調整。可以說,並行操作是一種需要特定支援、且不斷除錯的工程。作為一般情況下,我們儘量不選擇將其作為首要最佳化目標。

 

 

只有對於其他最佳化策略效果不好,或者根本就沒有其他解決方案的時候,考慮進行並行化操作。通常這樣情境下的SQL具有如下特點:

 

1、系統關鍵需求用例,沒有迴旋和妥協餘地。通常是大作業或者報表操作,現有SQL處理方式難以滿足使用者需求;

2、SQL涉及資料表量巨大,響應時間不能接受;

3、對大資料量資料表或者索引的DDL操作;

 

這樣型別的SQLOLTP系統中是不常見的,OLTP系統的側重點一般都是高併發、小事務和快速響應。Oracle並行操作是在OLAP系統中廣泛應用。當系統中出現了類似的問題和場景,可以考慮使用並行操作來提高系統整體相應。

 

 

ü        主機存在資源盈餘

 

 

通常情況下,生產環境的主機一般都不會做到滿負荷應用。並行操作是強制性的獲取到主機處理資源的一種手段,這樣做的前提是主機還存在資源盈餘。所以,在判斷進行並行操作之前,要確定是否可能主機已經滿負荷。

 

 

ü        SQL已經過最佳化調整

 

在各種調優層次級別中,從業務層面、SQL書寫層面進行的調優是價效比最高的一種型別。一種業務思路的變化和最佳化,可以就消除了若干及其複雜連線掃描操作。所以,進行最佳化的首先是從SQL本身的業務角度進行最佳化調整。

 

SQL本身沒有調優空間時,而且其他技術不能解決本身的海量資料操作時,可以考慮使用並行操作。

 

2、專案開發中並行操作規劃

 

注意,筆者在這裡使用到了規劃planning。的確,經過上面的介紹,並行操作是一種需要高階別關注的最佳化方案。筆者認為,可以從下面幾個方面做到規劃:

 

ü        預先識別,密切關注分析

 

對一些關鍵用例中涉及到的關鍵SQL,開發團隊中的開發DBA要做到事先心中有數。適時和開發團隊設計團隊進行溝通交流,提出有益的意見,衡量使用並行操作的必要性和可行性。原則還是一樣,能利用序列滿足需求,就慎用並行。

 

 

ü        集中規劃,統一設定

 

並不是每個需求說需要並行化就進行並行化。我們說整個系統中,需要和能夠進行並行化操作的場景是少數。開發DBA在接受到這樣的需求之後,要根據投產環境的承受能力按照優先順序進行實現。系統的並行承受能力不是無限的,儘可能滿足更多的重要用例,獲取更高的投入產出比是一個方向。

 

 

ü        保持監控,隨時調整

 

最佳化方案不是一成不變的,因為需求是在不斷的變化、資料也在不斷的演變,根據一時理解的最佳化方案可能也有需要變化更新的時候。這就要求存在一種最佳化方案跟蹤機制,定期監控方案並行操作的執行情況和效率。隨時發現和解決問題。

 

3、結論

 

並行操作的確立需要慎重,是一個不斷重複、推敲和衡量的過程。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/17203031/viewspace-696291/,如需轉載,請註明出處,否則將追究法律責任。

相關文章