並行(Parallel)操作特性,是Oracle為更充分利用伺服器硬體處理資源,提高特定大資料量操作效率,應對海量生產資料而推出的一種技術特性。通常,我們進行的SQL處理都是單進程操作,對應單個CPU操作單元。所謂的並行操作,就是在軟硬體條件允許的情況下,Oracle調用多個處理單元分別進行處理,最後匯合結果的過程。對一些SQL進行有計劃的並行操作,可以顯著提高系統操作速度。
1、海量資料的困局
互連網絡時代給世界帶來很多變化,其中一項就是資訊的爆炸,資料呈幾何級數增長。資料庫隨之進入海量、洋級時代,TB級資料庫已經越來越頻繁的出現在各類型應用情境中。開發人員和DBA就不得不面對一個困局,如果處理海量資料。
在傳統時代,我們最常藉助的一個最佳化手段是索引。通過檢索較少的資料區塊,擷取到合格資料行rowid。“索引進入執行計畫,替代全表掃描”成為我們最佳化的重要導向。但是,索引路徑不是使用者最終體驗。隨著資料量的增大(單表上G),即使我們的執行計畫很完美,檢索索引+資料區塊定位的時間損耗可能依然不能滿足客戶需求。其次,一些特定系統類別型(如OLAP系統),可能就是要進行全表掃描操作,對所有資料進行檢索處理。這些場合下,傳統的索引中心最佳化就無用武之地了。
在電腦科學中,“分治”這種古老的思想一直扮演著重要地位,無論是在軟體的演算法還是在硬體的體系。近年來,硬體技術,特別是多核CPU、多CPU電腦的逐漸普及,使得多核電腦、伺服器開始出現在公司專屬應用程式領域。多核CPU和多CPU本質上就是多處理單元並行的基礎。將一個任務劃分為若干個子任務,交由不同的處理單元進行同時處理,之後將結果集合匯總,是通用的單任務多處理進程模型。應該說,並行技術是建立在軟硬體技術基礎之上的,其中硬體技術是一個決定要素。
2、Oracle的平行處理
Oracle平行處理(Parallel Processing)特性主要是針對SQL語句處理的並行。目前Oracle提供支援並行的操作包括如下類型:
ü 並行查詢操作;
ü 並行DDL。對資料對象的DDL操作;
ü 並行DML。進行並行的資料更新修改;
在具體的應用情境上,有如下情境:
ü 資料表、索引範圍掃描的查詢;
ü 批量增加、修改和刪除操作;
ü 資料表、索引對象的建立;
ü “DBMS_STATS”收集統計量;
ü 備份復原管理員Recovery Manager的使用;
在Oracle中,一共包括三種進程Process類型,分別為客戶進程Client Process、服務進程Server Process和後台進程Background Process。其中,進行資料區塊讀取、修改寫入等實際操作的都是服務進程Server Process。Server Process是客戶進程在資料庫執行個體上的代理進程,保持著一對一的關係。由此,一般的SQL語句都是單進程串列操作的。
Oracle並行操作涉及的過程同一般並行操作的模型基本相似,包括處理單元和協調單元兩類進程組成。首先,處理的單一任務劃分為若干子任務。在協調進程(Coordinator)的作用下,並行操作被劃分為若干子任務,分別傳遞給多個並行服務進程進行處理。之後,各個進程將處理結果進行匯總,交付給協調進程進行組合,作為統一的結果返回。
並處處理在Oracle中是一個配置過程,包括很多參數配置和概念要素。其中最重要的兩個概念就是並行度和並行伺候進程池。下面分別來介紹兩個概念和相關的設定項目。
3、並行度和並行伺候進程池
並行度DOP(Degree Of Parallel)定義了進行並行操作時並行流的個數。DOP可以理解成進行平行處理時候,劃分的平行處理單元個數。但是,在實際的情況看,進行平行處理的進程個數往往是DOP的兩倍,也就是一個並行流實際上是兩個處理進程在進行處理工作。這樣的配置通常是為了實現進程之間的協調合作,緩解各個處理環節上的速度不匹配現象。
並行度DOP是Oracle並行操作中一個重要的配置參數。目前的Oracle版本中,支援手工配置和自動設定DOP兩種方式。如果是手工指定並行度,就需要在SQL語句上,通過hint來制定並行度的個數。自動設定DOP的含義是Oracle根據當前實際負載和並行進程池的狀況,經過計算自動的出的適應性並行度。下面是一些Oracle中與並行度相關的參數。
SQL> show parameter parallel
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
fast_start_parallel_rollback string LOW
parallel_adaptive_multi_user boolean TRUE
parallel_automatic_tuning boolean FALSE
parallel_degree_limit string CPU
parallel_degree_policy string MANUAL
parallel_execution_message_size integer 16384
parallel_force_local boolean FALSE
parallel_instance_group string
parallel_io_cap_enabled boolean FALSE
parallel_max_servers integer 10
parallel_min_percent integer 0
parallel_min_servers integer 0
parallel_min_time_threshold string AUTO
parallel_server boolean FALSE
parallel_server_instances integer 1
parallel_servers_target integer 4
parallel_threads_per_cpu integer 2
recovery_parallelism integer 0
上面參數的含義,會在本系列中逐漸使用和介紹。
DOP是一個設定項目,實際的並行工作還需要真是存在的進程完成。從上文的背景介紹中,一個session只對應一個Server Process,進行操作處理實際都需要Server Process來完成。平行處理中,Oracle引入了並行伺候進程池的概念。並行伺候進程池是一個進程的集合,針對需要進行平行處理的SQL操作,會從處理池中分配出適當數量的服務進程來進行處理。
一些與並行服務進程相關的參數,如下:
SQL> show parameter parallel_m
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
parallel_max_servers integer 10
parallel_min_percent integer 0
parallel_min_servers integer 0
4、一個並行Query的樣本
下面針對一個大資料量表,示範一下並行SQL的執行計畫。首先還是環境準備:
SQL> select * from v$version where rownum<2;
BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production
SQL> select count(*) from t;
COUNT(*)
----------
1110542
使用並行操作,最常用的方式是通過Hint進行指定(當然也可以通過對象Parallel屬性指定)。下面是沒有使用並行和使用並行兩個執行計畫的差異示範。
SQL> set linesize 10000;
SQL> set pagesize 10000;
SQL> explain plan for select * from t;
已解釋。