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以外にしないとパラレルで動作しない。
セッション毎のパラレル許可
※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';
のように記述する
パラレルヒントの書き方
※通常のヒント句と同様。単に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/コマンドまとめ