Oracle並行操作——從序列到並行

realkid4發表於2011-05-24

 

並行(Parallel)操作特性,是Oracle為更充分利用伺服器硬體處理資源,提高特定大資料量操作效率,應對海量生產資料而推出的一種技術特性。通常,我們進行的SQL處理都是單程式操作,對應單個CPU操作單元。所謂的並行操作,就是在軟硬體條件允許的情況下,Oracle呼叫多個處理單元分別進行處理,最後匯合結果的過程。對一些SQL進行有計劃的並行操作,可以顯著提高系統操作速度。

 

1、海量資料的困局

 

網際網路絡時代給世界帶來很多變化,其中一項就是資訊的爆炸,資料呈幾何級數增長。資料庫隨之進入海量、洋級時代,TB級資料庫已經越來越頻繁的出現在各型別應用場景中。開發人員和DBA就不得不面對一個困局,如果處理海量資料。

 

 

在傳統時代,我們最常藉助的一個最佳化手段是索引。透過檢索較少的資料塊,獲取到符合條件的資料行rowid。“索引進入執行計劃,替代全表掃描”成為我們最佳化的重要導向。但是,索引路徑不是使用者最終體驗。隨著資料量的增大(單表上G),即使我們的執行計劃很完美,檢索索引+資料塊定位的時間損耗可能依然不能滿足客戶需求。其次,一些特定系統型別(如OLAP系統),可能就是要進行全表掃描操作,對所有資料進行檢索處理。這些場合下,傳統的索引中心最佳化就無用武之地了。

 

 

在電腦科學中,“分治”這種古老的思想一直扮演著重要地位,無論是在軟體的演算法還是在硬體的體系。近年來,硬體技術,特別是多核CPU、多CPU計算機的逐漸普及,使得多核計算機、伺服器開始出現在企業應用領域。多核CPU和多CPU本質上就是多處理單元並行的基礎。將一個任務劃分為若干個子任務,交由不同的處理單元進行同時處理,之後將結果集合彙總,是通用的單任務多處理程式模型。應該說,並行技術是建立在軟硬體技術基礎之上的,其中硬體技術是一個決定要素。

 

2Oracle的並行處理

 

Oracle並行處理(Parallel Processing)特性主要是針對SQL語句處理的並行。目前Oracle提供支援並行的操作包括如下型別:

 

ü        並行查詢操作;

ü        並行DDL。對資料物件的DDL操作;

ü        並行DML。進行並行的資料更新修改;

 

在具體的應用場景上,有如下場景:

 

ü        資料表、索引範圍掃描的查詢;

ü        批次增加、修改和刪除操作;

ü        資料表、索引物件的建立;

ü        DBMS_STATS”收集統計量;

ü        備份恢復管理器Recovery Manager的使用;

 

Oracle中,一共包括三種程式Process型別,分別為客戶程式Client Process、服務程式Server Process和後臺程式Background Process。其中,進行資料塊讀取、修改寫入等實際操作的都是服務程式Server ProcessServer Process是客戶程式在資料庫例項上的代理程式,保持著一對一的關係。由此,一般的SQL語句都是單程式序列操作的。

 

Oracle並行操作涉及的過程同一般並行操作的模型基本相似,包括處理單元和協調單元兩類程式組成。首先,處理的單一任務劃分為若干子任務。在協調程式(Coordinator)的作用下,並行操作被劃分為若干子任務,分別傳遞給多個並行服務程式進行處理。之後,各個程式將處理結果進行彙總,交付給協調程式進行組合,作為統一的結果返回。

 

並處處理在Oracle中是一個配置過程,包括很多引數配置和概念要素。其中最重要的兩個概念就是並行度和並行伺候程式池。下面分別來介紹兩個概念和相關的配置專案。

 

3、並行度和並行伺候程式池

 

並行度DOPDegree Of Parallel)定義了進行並行操作時並行流的個數。DOP可以理解成進行並行處理時候,劃分的並行處理單元個數。但是,在實際的情況看,進行並行處理的程式個數往往是DOP的兩倍,也就是一個並行流實際上是兩個處理程式在進行處理工作。這樣的配置通常是為了實現程式之間的協調合作,緩解各個處理環節上的速度不匹配現象。

 

並行度DOPOracle並行操作中一個重要的配置引數。目前的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;

已解釋。

 

已用時間:  00: 00: 00.03

SQL> select * from table(dbms_xplan.display(format => 'advanced'));

 

PLAN_TABLE_OUTPUT

--------------------------------------------------------------------------------

Plan hash value: 1601196873

--------------------------------------------------------------------------

| Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)| Time     |

--------------------------------------------------------------------------

|   0 | SELECT STATEMENT  |      |  1156K|   106M|  4464   (1)| 00:00:54 |

|   1 |  TABLE ACCESS FULL| T    |  1156K|   106M|  4464   (1)| 00:00:54 |

--------------------------------------------------------------------------

(篇幅原因,有刪節

 

針對一般的SQL查詢,是不使用Parallel Query特性的。下面針對Hint使用:

 

 

SQL> explain plan for select /*+ parallel */ * from t;

已解釋。

 

已用時間:  00: 00: 00.06

SQL> select * from table(dbms_xplan.display(format => 'advanced'));

PLAN_TABLE_OUTPUT

----------------------------------------------------------------------------------------------------

Plan hash value: 3050126167

----------------------------------------------------------------------------------------------------

| Id  | Operation            | Name     | Rows  | Bytes | Cost (%CPU)| Time     |    TQ  |IN-OUT| PQ Distrib |

----------------------------------------------------------------------------------------------------

|   0 | SELECT STATEMENT     |          |  1156K|   106M|  2478   (1)| 00:00:30 |        |      |            |

|   1 |  PX COORDINATOR      |          |       |       |            |          |        |      |            |

|   2 |   PX SEND QC (RANDOM)| :TQ10000 |  1156K|   106M|  2478   (1)| 00:00:30 |  Q1,00 | P->S | QC

|   3 |    PX BLOCK ITERATOR |          |  1156K|   106M|  2478   (1)| 00:00:30 |  Q1,00 | PCWC |            |

|   4 |     TABLE ACCESS FULL| T        |  1156K|   106M|  2478   (1)| 00:00:30 |  Q1,00 | PCWP |            |

----------------------------------------------------------------------------------------------------

Automatic Degree of Parallelism Information:

--------------------------------------------

 

   - Degree of Parallelism of 2 is derived from scan of object SYS.T

 

Note

-----

-automatic DOP: Computed Degree of Parallelism is 2

 

 

上面的執行計劃,可以看出將全表掃描分割為多個DOP進行處理,之後彙總到協調者程式中,返回結果。

 

同時,使用parallelhint後,沒有顯示指定出並行度。Oracle採用自動並行度方式,採用2作為並行度。

 

最後,時間使用上。估算出的執行計劃只需要使用30s,而之前的序列計劃則需要接近一分鐘時間。

 

5、謹慎處理並行

 

最後,想談談並行的一些使用注意原則。

 

ü        慎用並行。並行處理使用的目的是在提高系統軟硬體資源使用率,從而提高SQL執行效率。但是,並不是所有SQL使用並行都可以提高效能。同索引一樣,使用並行也是有成本付出的,這就是多程式之間啟動和協調成本。通常,只有在處理超大規模資料、而且沒有其他常規最佳化方法,並且證明並行可以帶來提升的情況下,才考慮使用並行;

ü        統一併行。同其他最佳化方案一樣,並行是否使用,哪個SQL使用並行,並行度取值多少。這些問題不是單個模組和開發人員可以確定的,需要系統整體考慮。如果說索引消耗的是空間和處理資源的話,並行額外付出是處理CPU協調成本。這些最佳化方法最好有統一的最佳化方案全域性考量和跟蹤,決不能各行其是,引起效能新問題;

ü        確定並行。並行處理是需要各種引數進行配合使用的,我們希望使用並行,就要保證實際執行的語句確實在進行並行處理。這要透過不斷的跟蹤執行計劃和處理過程來實現。

 

 

Oracle Parallel特性是一柄雙刃劍,要小心仔細對待。

 

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

相關文章