1. 程式人生 > >運用PARALLEL方式成倍提升Oracle資料分析效率

運用PARALLEL方式成倍提升Oracle資料分析效率

       Oracle作為一種大型資料庫,在我國已成為大型企事業單位(如公立醫院)的主流資料庫並佔有了絕對的市場份額。這就意味著審計工作同Oracle的交集越來越多,同時這種資料庫的使用也意味著遠超SQL SERVER的海量資料資訊,其資料分析效率成為嚴重製約審計工作進度的瓶頸。本文將介紹在Oracle中如何通過採用PARALLEL(並行)方式最大化呼叫計算機資源來成倍提高資料分析效率。

什麼是PARALLEL   在Oracle中,對於一條執行語句,預設是用一個CPU程序進行序列執行(就好比我們一個審計專案從審計調查到最後出報告都只由一個人來一步一步執行,執行效率的低下是顯而易見的)。而現在的CPU一般都擁有多核心多執行緒,這時我們就可以將一條執行語句交由這些多執行緒進行並行執行(就像一個審計專案成立了一個審計組,由各不同的人員分任務分別執行,最後彙總出報告)。這也就是Oracle的PARALLEL方式的基本原理。排除儲存介質頻寬等因素,理論上來說,呼叫了多少個CPU執行緒就可以縮短語句執行時間多少倍。以較為常見的單路至強處理E3-1230V3伺服器為例,CPU匯流排程為8,因此如果採用PARALLEL調取8個執行緒執行查詢語句,理論上會使執行時間縮短8倍。如果在雙路甚至四路伺服器上更會有幾十倍的效率提升。

如何檢視能夠利用的並行程序數   如上所說,CPU的匯流排程決定了PARALLEL能呼叫的最大資源,因此,要知道計算機的匯流排程數才能確定能利用的最大資源數。一般來說計算機匯流排程數=CPU個數×每個CPU的物理核心數量×每個核心的執行緒數量。以上面提到的單路至強E3-1230V3 CPU為例,匯流排程數為=1(1個CPU)×4(4個物理核心)×2(每個核心2個執行緒)=8。如果用的Windows作業系統,檢視計算機匯流排程數最簡單的辦法是檢視“工作管理員-資源監視器-CPU”資源監視視窗個數,有幾個CPU監視視窗就表示有幾個執行緒。非Windows作業系統可以在Oracle命令提示符中輸入Show Parameters CPU來檢視CPU執行緒數。

如何使用PARALLEL執行查詢   Oracle中PARALLEL的查詢執行方式有三種。一是修改會話(Session)級別預設的並行度;二是修改表級別的並行度;三是採用Hint方式設定語句級別的並行度。因為Hint方式具有靈活度較高的優點,因此本文主要介紹通過Hint方式現實PARALLEL的查詢執行。其查詢執行語句格式為:

SELECT  /*+PARALLEL(n)*/  *  FROM table 1   其中的(n)為設定要呼叫的並行度數量。

PARALLEL的運用例項   下面以某醫院的入院費用明細表inp_bill_detail(含有記錄23704010行)為例,實測運用PARALLEL方式查詢效率。

1.檢視Oracle能利用的最大並行度: SQL> show parameters cpu

NAME                                       TYPE        VALUE ------------------------------------   -----------    ------- cpu_count                                integer         8 parallel_threads_per_cpu                 integer         2 resource_manager_cpu_allocation          integer         8  

結果顯示CPU邏輯核心數為8,每個CPU的並行執行緒數為2(物理核心數為8/2=4核),這個8就是本計算機的匯流排程數也就是PARALLEL能利用的最大並行度。

2.PARALLEL效率測試。先測試在預設狀態下對此表進行全表查詢的計劃用時: SQL> EXPLAIN PLAN FOR    2  SELECT  *  FROM  inp_bill_detail ;

已解釋。

SQL> SELECT * FROM TABLE(dbms_xplan.display); PLAN_TABLE_OUTPUT --------------------------------------------------------------------- Plan hash value: 1223321316 ------------------------------------------------------------------------------------- | Id  | Operation         | Name            | Rows  | Bytes | Cost (%CPU)| Time     | ------------------------------------------------------------------------------------- |   0 | SELECT STATEMENT  |                 |    23M|  4362M|   204K  (2)| 00:40:54 | |   1 |  TABLE ACCESS FULL| INP_BILL_DETAIL |    23M|  4362M|   204K  (2)| 00:40:54 | ------------------------------------------------------------------------------------- 可以看到進行全表查詢的預計執行時間為40分54秒。

3.將並行度設定為8,測試在此狀態下進行全表查詢的計劃用時: SQL> EXPLAIN PLAN FOR   2  SELECT  /*+PARALLEL(8)*/ *  FROM  inp_bill_detail ;

已解釋。

SQL> SELECT × FROM TABLE(dbms_xplan.display);

PLAN_TABLE_OUTPUT --------------------------------------------------------------------- Plan hash value: 2466333535 --------------------------------------------------------------------- | Id  | Operation            | Name            | Rows  | Bytes | Cost (%CPU)| Time     | -------------------------------------------------------------------------------------- |   0 | SELECT STATEMENT     |                 |    23M|  4362M| 28341   (2)| 00:05:41 | |   1 |  PX COORDINATOR      |                 |       |       |            |          | |   2 |   PX SEND QC (RANDOM)| :TQ10000        |    23M|  4362M| 28341   (2)| 00:05:41 | |   3 |    PX BLOCK ITERATOR |                 |    23M|  4362M| 28341   (2)| 00:05:41 | |   4 |     TABLE ACCESS FULL| INP_BILL_DETAIL |    23M|  4362M| 28341   (2)| 00:05:41 | ---------------------------------------------------------------------

Note -----    - Degree of Parallelism is 8 because of hint   可以看到將並行度設定為8後,進行全表查詢的預計執行時間大大縮短到5分41秒,效率提升近七倍。  值得注意的是,在實際使用中,計算機除了執行Oracle外,同時還在執行其他程式(如系統程式)。因此,用PARALLEL呼叫CPU執行緒值應設定為小於最大CPU執行緒的數值(筆者一般採用的值為:CPU執行緒總數-2)以避免將所有CPU資源強行分配給Oracle使用後導致系統無響應等情況發生。