之前我一直不理解為什麼做并行DML之前要加上:alter session enable parallel dml,總以為hint指定就可以了,實際上是錯誤的,下面記錄下這個問題,并且總結下并行這塊内容。
并行的實現機制是:首先,Oracle會創建一個進程用于協調并行服務進程之間的信息傳遞,這個協調進程将需要操作的數據集(比如表的數據塊)分割成很多部分,稱為并行處理單元,然後并行協調進程給每個并行進程分配一個數據單元。比如有四個并行服務進程,他們就會同時處理各自分配的單元,當一個并行服務進程處理完畢後,協調進程就會給它們分配另外的單元,如此反複,直到表上的數據都處理完畢,最後協調進程負責将每個小的集合合并為一個大集合作為最終的執行結果,返回給用戶。
并行處理的機制實際上就是把一個要掃描的數據集分成很多小數據集,Oracle會啟動幾個并行服務進程同時處理這些小數據集,最後将這些結果彙總,作為最終的處理結果返回給用戶。
這種數據并行處理方式在OLAP系統中非常有用,OLAP系統的表通常來說都是非常大,如果系統的CPU比較多,讓所有的CPU共同來處理這些數據,效果就會比串行執行要高得多。
然而對于OLTP系統,通常來講,并行并不合适,原因是OLTP系統上幾乎在所有的SQL操作中,數據訪問路徑基本上以索引訪問為主,并且返回結果集非常小,這樣的SQL操作的處理速度一般非常快,不需要啟用并行。
當Oracle數據庫啟動的時候,實例會根據初始化參數 PARALLEL_MIN_SERVERS=n的值來預先分配n個并行服務進程,當一條SQL被CBO判斷為需要并行執行時發出SQL的會話進程變成并行協助進程,它按照并行執行度的值來分配進程服務器進程。
首先協調進程會使用ORACLE啟動時根據參數: parallel_min_servers=n的值啟動相應的并行服務進程,如果啟動的并行服務器進程數不足以滿足并行度要求的并行服務進程數,則并行協調進程将額外啟動并行服務進程以提供更多的并行服務進程來滿足執行的需求。然後并行協調進程将要處理的對象劃分成小數據片,分給并行服務進程處理;并行服務進程處理完畢後将結果發送給并行協調進程,然後由并行協調進程将處理結果彙總并發送給用戶。
上面講的是一個并行處理的基本流程。實際上,在一個并行執行的過程中,還存在着并行服務進程之間的通信問題。
下面看下有沒alter session enable parallel dml所産生的效果。
EXPLAIN PLAN FOR UPDATE /* parallel(t 8)*/ test1 t SET object_id=1; SELECT * FROM table (DBMS_XPLAN.display(NULL, NULL, 'BASIC PARALLEL'));
當我看到執行計劃裡面有Q1,00這樣的描述,就以為并行度hint生效了,但是我沒注意到,這裡并行度隻用在對test1表的全盤掃描上,并沒有用在update上。
這裡可以看到執行計劃上的差别:這次不止全盤掃描時用到了并行度,而且update時也用上了并行度,這才是我們需要的!!
ps:注意最後要把session的并行度關掉:
alter session disable parallel dml;
關于Oracle的多線程處理功能,就像電腦裝了多核的CPU,但大多情況下都不會完全多核同時啟用(2核以上的比較明顯),使用parallel說明,就會多核同時工作,來提高效率。但本身啟動這個功能,也是要消耗資源與性能的。所有,一般都會在返回記錄數大于100萬時使用,效果也會比較明顯。
後面會分享更多devops和DBA方面的内容,感興趣的朋友可以關注一下~
更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!