並行執行

jelephant發表於2014-01-09
並行的實現機制是: 首先,Oracle 會建立一個程式用於協調並行服務程式之間的資訊傳遞,這個協調程式將需要操作的資料集(比如表的資料塊)分割成很多部分,稱為並行處理單元,然後並行協調程式給每個並行程式分配一個資料單元。比如有四個並行服務程式,他們就會同時處理各自分配的單元,當一個並行服務程式處理完畢後,協調程式就會給它們分配另外的單元,如此反覆,直到表上的資料都處理完畢,最後協調程式負責將每個小的集合合併為一個大集合作為最終的執行結果,返回給使用者。

這種資料並行處理方式在OLAP系統中非常有用,OLAP系統的表通常來說都是非常大,如果系統的CPU比較多,讓所有的CPU共同來處理這些資料,效果就會比序列執行要高的多。然而對於OLTP系統,通常來講,並行並不合適,原因是OLTP系統上幾乎在所有的SQL操作中,資料訪問路勁基本上以索引訪問為主,並且返回結果集非常小,這樣的SQL 操作的處理速度一般非常快,不需要啟用並行。

並行查詢
並行查詢允許將一個SQL select 語句劃分為多個較小的查詢,每個部分的查詢併發的執行,然後將各個部分的結果組合起來,提供最終的答案。
並行查詢需要保證兩個前提,第一,需要執行一個大任務,這說明,並行查詢不能作為典型OLTP系統的解決方案,因為在OLTP系統中,不會執行長時間執行的任務,這些系統上啟用並行執行通常是災難性的;第二,需要有充足的空閒資源。

一個查詢能夠並行執行,需要滿足一下條件:
 SQL語句中有Hint提示,比如Parallel 或者 Parallel_index.
 SQL語句中引用的物件被設定了並行屬性。
 多表關聯中,至少有一個表執行全表掃描(Full table scan)或者跨分割槽的Index range SCAN。
如: select  /*+parallel(t 4) * from t;

注意:並行執行更應該算是一個DBA工具,而不是一個並行查詢工具


並行DML
需要顯式的啟用PDML
alter session enable parallel dml;
由於PDML採用的是一種偽分部的實現,因此存在一些限制:
1、PDML操作期間不支援觸發器
2、PDML期間,不支援某些宣告方式的引用完整性約束,因為表中的每一部分會在單獨的會話中作為單獨的事物進行修改。
3、在提交或回滾之前,不能訪問用PDML修改的表
4、PDML不支援高階複製(高階複製特性的實現要基於觸發器)
5、不支援延遲約束
6、如果表是分割槽的,PDML只可能在有點陣圖索引或LOB列的表上執行,並且並行度取決於分割槽數。在這種情況下,無法在分割槽內並行執行一個操作,因為每個分割槽只有一個並行執行伺服器來處理。
7、執行PDML時不支援分散式事務
8、PDML不支援聚簇表


並行DDL
以下SQL DDL命令允許並行化
1、create index,多個並行執行伺服器可以掃描表、對資料排序,並把有序的段寫出到索引結構
2、create table as select,執行select的查詢可以使用並行查詢來執行,表載入本身可以並行完成
3、alter index rebuild,索引結構可以並行重建
4、alter table move,表可以並行移動(可以並行move一個表的單個分割槽)
以上4個命令也適用於單個的表/索引分割槽
5、alter table split|coalesce partition:單個表分割槽可以並行的分解或合併
6、alter index split partition,索引分割槽可以並行的分解

注意,採用並行DDL與外部表載入資料時,儘量採用區段截斷,uniform本地管理表空間不支援區段截斷,autoallocate本地管理表空間支援區段截斷,即載入資料的表使用autoallocate屬性的表空間
create tablespace tbs datafile '/u01/app/....../tbs.dbf' size 100m reuse
autoextend on next 100m
extent management local
autoallocate(uniform size 100m);


過程並行化
並行管道函式(parallel pipelined function)
DIY並行化,是指在你自己的應用上使用oracle執行並行全表掃描所採用的技術


並行度可以透過以下三種方式來設定:
 使用Hint 指定並行度。
 使用alter session force parallel 設定並行度。
 使用SQL中引用的表或者索引上設定的並行度,原則上Oracle 使用這些物件中並行度最高的那個值作為當前執行的並行度。

示例:
SQL>Select /*+parallel(t 4) */ count(*) from t;
SQL>Alter table t parallel 4;
SQL>Alter session force parallel query parallel 4;

並行度的優先順序別從高到低:
Hint->alter session force parallel->表,索引上的設定-> 系統引數

實際上,並行只有才系統資源比較充足的情況下,才會取得很好的效能,如果系統負擔很重,不恰當的設定並行,反而會使效能大幅下降。

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

相關文章