Oracle:SQLのパラレル実行 | けしくんのWebLog

けしくんのWebLog

自分が考えたこと、調べたことを忘れずに残しておくため、Web上にLogを残していきます。

1つのSQLをOracleDBの機能で並列処理する方法。

Oracle10g以降対応。
さらに細かく指定したい場合は、マニュアルをみる。

よく使うOracle SQL/コマンドまとめ

SQLのパラレル実行について

通常SQLの実行は1プロセスで行われるが、これを複数のセッションで実行させることが可能。

DB全体をパラレル処理に設定できるが、OLAP専用DB以外ではほぼ使用しない。

 

パラレル問合せ、パラレルDML、パラレルDDLをパラレル実行することができる。

<実行条件>

・PARALLEL句(テーブルの属性、索引の属性など)を指定されている

 または

・PARALLELヒントを指定している

 

PARALLELを指定していない場合でも、以下のようにALTER SESSION FORCE PARALLEL文で強制的にパラレル化することも可能。ただし、DMLについてはデフォルトがDISABLE(シリアルで実行)であるため、以下のSQL文でDISABLE以外にしないとパラレルで動作しない。

 

セッション毎のパラレル許可

ALTER SESSION {ENABLE|DISABLE|FORCE} PARALLEL {DML|DDL|QUERY} [PARALLEL <パラレル度>];

※ENABLE::PARALLEL句またはPARALLELヒントのパラレル度で実行する
  DISABLE::シリアルで実行する
  FORCE::PARALLEL句またはPARALLELヒントが指定されていない場合でもパラレルで実行する

※DML:INSERT,DELETE,UPDATE,MERGEが対象

  DDL:CREATE INDEX,ALTER INDEX,CREATE TABLE AS SELECTなどが対象

  QUERY:SELECTが対象

※PARALLEL句を指定しない場合はデフォルトのパラレル度となる(通常サーバーのCPU数)

※PL/SQL内でパラレル化したい場合は、

  EXECUTE IMMEDIATE 'ALTER SESSION ENABLE PARALLEL DML';

  のように記述する

 

パラレルヒントの書き方

UPDATE /*+ PARALLEL */ SCOTT.EMP SET SAL = 10000;

※通常のヒント句と同様。単にPARALLELと書けばよい。

※FORCEの場合は不要。

 

パラレル化される条件、注意事項など

1.パラレルクエリー(SELECT)

・全表スキャン(FULL TABLE SCAN)
  対象テーブルのパラレル度を2以上に設定
・索引高速スキャン(INDEX FAST FULL SCAN)
 対象索引のパラレル度を2以上に設定、かつ、必要な列がすべて索引に含まれている(テーブルにアクセスする必要がない場合)。
・パラレル索引スキャン
 パーティション索引で2以上のパーティションがアクセスされる場合
 ・結合
 すべての結合
・ソート
 ORDER BYなどのソート。レンジ分割で行うため、データが偏り易い。
・グループ関数の集計

 

2.パラレルDML

・それぞれのSQLにおいて条件があるため、常にパラレル実行できるとは限らない。

・同じテーブルに対するパラレルDMLは、トランザクションの最初でかつ唯一である必要がある。

 つまり、DML発行後、Commitしない限りそのデータにSELECTによるアクセスは不可能。

 (SELECTするとORA-12838が発生)

 また、シリアルDMLされたテーブルに後からパラレルDMLを行う場合もエラーとなる(ORA-12839)。

 

3.パラレルDDL

・ダイレクト操作で(ダイレクト・パス・インサートと同様に)実行されるため、

 NOLOGGINGモードで行うと REDOログやUNDOデータを生成しないで動作することが可能。
 ただし、NOLOGGINGを付けないとREDOログにブロック・イメージを出力する。

よく使うOracle SQL/コマンドまとめ