日本語PDF

8.5 並列処理の種類

並列処理には複数のタイプがあります。

ここでは、次の項目で並行処理の種類について説明します。

8.5.1 パラレル問合せについて

SELECT文でパラレル問合せとパラレル副問合せを使用できます。DDL文とDML文(INSERTUPDATEおよびDELETE)の問合せ部分もパラレルで実行できます。

また、外部表をパラレルで問い合せることもできます。

SQL問合せのパラレル化決定には、パラレル化の決定と並列度(DOP)という2つの要素があります。これらの要素の決定方法は、問合せ、DDL操作およびDML操作で異なります。DOPを決定するときに、Oracle Databaseは次の参照オブジェクトを調べます。

  • パラレル問合せは、パラレルで実行される問合せの部分で、それぞれの表および索引を調べて、どれが参照表かを決定します。原則として、最大のDOPが設定された表または索引を選択します。

  • パラレルDML(INSERTUPDATEMERGEおよびDELETE)では、DOPを決定する参照オブジェクトは、挿入、更新または削除操作によって変更される表です。パラレルDMLではデッドロックを防ぐためにDOPに制限が課せられます。パラレルDML文に副問合せが含まれる場合、副問合せのDOPはDML操作のDOPと同じになります。

  • パラレルDDLでは、DOPを決定する参照オブジェクトは、作成、再構築、分割または移動される表、索引またはパーティションです。パラレルDDL文に副問合せが含まれる場合、副問合せのDOPはDDL操作と同じになります。

この項では、次の項目について説明します。

関連項目:

8.5.1.1 索引構成表のパラレル問合せ

索引構成表ではいくつかのパラレル・スキャン方法がサポートされています。

パラレル・スキャン方法には、次が含まれます。

  • 非パーティション索引構成表のパラレル高速全スキャン

  • パーティション索引構成表のパラレル高速全スキャン

  • パーティション索引構成表のパラレル索引レンジ・スキャン

オーバーフロー領域を含む索引構成表およびLOBを含む索引構成表に対して、これらのスキャン方法を使用できます。

8.5.1.2 非パーティション索引構成表

非パーティション索引構成表に対するパラレル問合せでは、パラレル高速全スキャンが使用されます。

作業の割当ては、索引セグメントを十分な数のブロック・レンジに分割し、ブロック・レンジをデマンドドリブン方式でパラレル実行サーバーに割り当てることで行われます。任意の行に対応するオーバーフロー・ブロックは、その行を所有するプロセスによってのみデマンドドリブン方式でアクセスされます。

8.5.1.3 パーティション化索引構成表

索引レンジ・スキャンと高速全スキャンの両方をパラレルで実行できます。

パラレル高速全スキャンでは、パラレル化は非パーティション索引構成表の場合と同じです。DOPによって異なりますが、各パラレル実行サーバーは、1つ以上のパーティションを取得します。各パーティションは、主キー索引セグメントと関連するオーバーフロー・セグメント(ある場合)を含みます。

8.5.1.4 オブジェクト型のパラレル問合せ

パラレル問合せを、オブジェクト型の表およびオブジェクト型の列を含む表に実行することができます。

オブジェクト型に対するパラレル問合せでは、オブジェクト型に対する順次問合せで使用できるすべての機能がサポートされます。

  • オブジェクト型に対するメソッド

  • オブジェクト型の属性アクセス

  • オブジェクト型インスタンスを作成するためのコンストラクタ

  • オブジェクト・ビュー

  • オブジェクト型に対するPL/SQLおよびOracle Call Interface (OCI)問合せ

パラレル問合せではオブジェクト型のサイズの制限はありません。

オブジェクト型に対してパラレル問合せを使用する際には次の制限が適用されます。

  • 結合とソート(ORDER BYGROUP BYまたは集合操作による)を含む問合せをパラレルで実行するにはMAP関数が必要です。MAP関数がない場合、問合せは自動的にシリアルで実行されます。

  • パラレルDMLおよびパラレルDDLはオブジェクト型に対してはサポートされず、そのような文は常にシリアルで実行されます。

これらいずれかの制限のために問合せをパラレルで実行できない場合は、常に問合せ全体がシリアルで実行されエラー・メッセージは返されません。

8.5.1.5 問合せのパラレル化のルール

SQL問合せは、特定の条件下でのみパラレルで実行できます。

SELECT文をパラレルで実行できるのは、次の条件のいずれかが満たされている場合のみです。

  • 問合せに、文レベルまたはオブジェクト・レベルのパラレル・ヒント仕様(PARALLELまたはPARALLEL_INDEX)が含まれている。

  • 問合せ内で参照されるスキーマ・オブジェクトに、PARALLEL宣言が関連付けられている。

  • 自動並列度(自動DOP)が有効になっている。

  • ALTER SESSION FORCE PARALLEL QUERY文を使用してパラレル問合せが強制されている。

また、実行計画には、少なくとも次のいずれかが必要となります。

  • 全表スキャン

  • 複数パーティションに及ぶ索引レンジ・スキャン

  • 索引高速全体スキャン

  • パラレル表関数

関連項目:

8.5.2 パラレルDDL文について

このトピックでは、DDL文の並列処理について説明します。

DDL文の並列処理に関するこの項には、次のトピックが含まれます。

8.5.2.1 パラレル化できるDDL文

表および索引(パーティションまたは非パーティション)に対するDDL文をパラレルで実行できます。

非パーティション表および非パーティション索引のパラレルDDL文は次のとおりです。

  • CREATE INDEX

  • CREATE TABLE AS SELECT

  • ALTER TABLE MOVE

  • ALTER INDEX REBUILD

パーティション表およびパーティション索引のパラレルDDL文は次のとおりです。

  • CREATE INDEX

  • CREATE TABLE AS SELECT

  • ALTER TABLE {MOVE|SPLIT|COALESCE} PARTITION

  • ALTER INDEX {REBUILD|SPLIT} PARTITION

    • この文をパラレルで実行できるのは、分割対象の(グローバル)索引パーティションが使用可能な場合のみです。

このようなDDL操作はすべて、パラレル実行でもシリアル実行でもNOLOGGINGモードで実行できます。

索引構成表のCREATE TABLE文は、AS SELECT句の有無にかかわらずパラレルで実行できます。

パラレルDDLは、オブジェクト列を含む表では実行できません。パラレルDDLは、LOB列を含む非パーティション表では実行できません。

8.5.2.2 パラレルでのCREATE TABLE AS SELECTの使用について

パラレル実行により、問合せをパラレルで実行でき、別の表または表セットから副問合せとして表を作成する操作を作成できます。

このパラレル機能は、サマリーまたはロールアップ表の作成で非常に役に立ちます。

クラスタ表の作成と移入は、パラレルで行えないことに注意してください。

図8-4に、パラレルでの副問合せを使用したサマリー表の作成を示します。

図8-4 パラレルでのサマリー表の作成

図8-4の説明が続きます
「図8-4 パラレルでのサマリー表の作成」の説明

8.5.2.3 リカバリ可能性とパラレルDDL

パラレルDDLは、サマリー表の作成や、スタンドアロン・トランザクションである大量データ・ロードの実行(必ずしもリカバリ可能でなくてもよい)によく使用されます。

Oracle DatabaseロギングをオフにするとUNDOログまたはREDOログは生成されないため、パラレルDML操作のパフォーマンスは多くの場合向上しますがオールオアナッシング操作になります。つまり、操作がなんらかの理由で失敗した場合、操作をやりなおす必要があります。再開することはできません。

パラレル表作成(またはその他のパラレルDDL操作)時にロギングを無効化する場合は、メディア障害による表の損失を防ぐために、表が作成されてからその表を含む表領域をバックアップする必要があります。

UNDOログおよびREDOログの生成を無効にするには、CREATE TABLECREATE INDEXALTER TABLEおよびALTER INDEX文でNOLOGGING句を使用します。

8.5.2.4 パラレルDDLの領域管理

表または索引のパラレルでの作成は、領域管理と密接に関連します。

これらの領域管理は、パラレル操作時に必要な記憶領域、および表または索引が作成された後に使用可能な空き領域の両方に影響します。

8.5.2.5 ディクショナリ管理表領域使用時の記憶領域

表または索引をパラレルで作成するとき、各パラレル実行サーバーはCREATE文のSTORAGE句の値を使用して、行を格納するための一時セグメントを作成します。

NEXT設定が4MB、PARALLEL DEGREEが16で作成される表は、作成時に少なくとも64MBの記憶域を消費します。各パラレル・サーバー・プロセスが4MBのエクステントで開始するためです。パラレル実行コーディネータがセグメントを結合するときに、セグメントの一部が切り捨てられ、生成される表はリクエストの64MBよりも小さくなることがあります。

8.5.2.6 空き領域とパラレルDDL

索引と表をパラレルで作成するとき、各パラレル実行サーバーが新しいエクステントを割り当て、エクステントに表または索引のデータを格納します。

たとえば、DOPを4として索引を作成する場合、索引には最初の時点で少なくとも4つのエクステントがあります。このエクステントの割当ては、パラレルでの索引再構築の場合や、パラレルでのパーティションの移動、分割または再構築の場合と同様に行われます。

シリアル操作では、スキーマ・オブジェクトに少なくとも1つのエクステントが必要です。パラレル作成では、表または索引に、スキーマ・オブジェクトを作成するパラレル実行サーバーと同数のエクステントがあることが必要です。

表または索引をパラレルで作成するとき、空き領域が作成されることがあります。これは、パラレル実行サーバーで使用される一時セグメントが、行の格納に必要なサイズよりも大きい場合に発生します。

  • 各一時セグメント内の未使用領域が、表領域レベルで設定されたMINIMUM EXTENTパラメータの値よりも大きい場合、Oracle Databaseがすべての一時セグメントの行を表または索引にマージするときに未使用領域を切り捨てます。未使用領域はシステムの空き領域に戻され、新しいエクステント用に割り当てることができます。ただし、連続した領域ではないため、結合してより大きいセグメントにすることはできません(外部断片化)。

  • 各一時セグメントの未使用領域がMINIMUM EXTENTパラメータの値よりも小さい場合は、一時セグメントの行をマージするときに未使用領域を切り捨てることはできません。この未使用領域はシステムの空き領域に戻されません。表または索引の一部として残り(内部断片化)、後から行われる挿入や追加領域を必要とする更新のためにのみ使用されます。

たとえば、CREATE TABLE AS SELECT文でDOPを3と指定したが、表領域には1つしかデータファイルがない場合、図8-5に示すように内部断片化が発生することがあります。データファイルの内部表エクステント内の空き領域を他の空き領域と結合して、エクステントとして割り当てることはできません。

図8-5 使用できない空き領域(内部断片化)

図8-5の説明が続きます
「図8-5 使用できない空き領域(内部断片化)」の説明

関連項目:

パラレルでの表および索引作成の詳細は、『Oracle Database SQLチューニング・ガイド』を参照してください

8.5.2.7 DDL文のルール

DDL操作は、特定の条件下でパラレルで実行できます。

DDL操作をパラレルで実行できるのは、次の条件のうち少なくとも1つが満たされている場合のみです。

  • 構文でPARALLEL句(宣言)が指定されている。CREATE TABLECREATE INDEXALTER INDEX REBUILDおよびALTER INDEX REBUILD PARTITIONの場合、パラレル宣言はデータ・ディクショナリに格納されます。
  • 自動並列度(自動DOP)が有効になっている。

  • ALTER SESSION FORCE PARALLEL DDL文を使用してパラレルDDLが強制されている。

関連項目:

8.5.2.8 CREATE TABLE AS SELECTのルール

CREATE TABLE AS SELECT文のCREATE操作は、パラレル化DDL文のルールに基づいてパラレル化されます。

また、文のSELECT部分で指定されている文レベルPARALLELヒントでも、DDL操作をパラレル化できます。パラレル化DDL文のルールの詳細は、DDL文のルールを参照してください。

CREATE TABLE AS SELECTCREATE操作がパラレル化されるとき、可能であればスキャン操作もパラレル化されます。

DDL部分がパラレル化されない場合でも、問合せのパラレル化のルールに基づいて、SELECT部分をパラレル化できます。

自動並列度(自動DOP)では、文のDDL部分と問合せ部分の両方がパラレル化されます。

並列度(DOP)を決定するためのルールの詳細は、SQL文の並列度ルールを参照してください。

8.5.3 パラレルDML操作について

このトピックでは、パラレルDML操作について説明します。

パラレルDML(PARALLEL INSERTUPDATEDELETEおよびMERGE)は、パラレル実行メカニズムを使用して、大規模なデータベース表や索引に対する大規模なDML操作を高速化または拡張します。

ノート:

通常、DMLには問合せが含まれますが、この章ではDMLという語はINSERTUPDATEMERGEおよびDELETE操作のみを指すものとして使用しています。

ここでは、パラレルDMLの次の項目について説明します。

8.5.3.1 パラレルDMLを使用する場合

パラレルDMLが役立つのは、大容量オブジェクトにアクセスする際のパフォーマンスとスケーラビリティが重要になる意思決定支援システム(DSS)環境です。パラレルDMLは、DSSデータベースのための問合せ機能と更新機能の両方を提供し、パラレル問合せを補います。

並列処理の設定に伴うオーバーヘッドのため、パラレルDML操作は短時間のOLTPトランザクションでの実行には適していません。ただし、パラレルDML操作を使用してOLTPデータベースでのバッチ・ジョブの実行を高速処理することができます。

パラレルDMLが使用されるシナリオの一部を次に示します。

8.5.3.1.1 データ・ウェアハウス・システムでの表のリフレッシュ

データ・ウェアハウス・システムでは、大容量の表を本番システムの新規データまたは変更データで定期的にリフレッシュ(更新)する必要があります。

MERGE文を使用すると、これを効率よく実行できます。

8.5.3.1.2 中間サマリー表の作成

DSS環境では、多くのアプリケーションで、多数の大容量中間サマリー表の作成や操作を行う複雑な計算が必要です。

このようなサマリー表は多くの場合は一時的に使用され、ロギングする必要がないものが大半です。パラレルDMLを使用すると、このような大容量中間表に対する操作が高速化されます。メリットの1つは、増分結果を中間表に格納して、パラレル更新を実行できることです。

また、サマリー表には、アプリケーション・セッションが終了しても保存する必要がある累積情報または比較情報が含まれる場合もあります。つまり、一時表は使用できません。パラレルDML操作を使用すると、このような大容量サマリー表に対する変更が高速化されます。

8.5.3.1.3 スコアリング・テーブルの使用

多くのDSSアプリケーションは、一連の基準に基づいて定期的に顧客をスコアリングしています。

通常、スコアは大容量のDSS表に格納されます。その後、スコア情報は意思決定(たとえばメーリング・リストへの指定)で使用されます。

このようなスコアリング・アクティビティでは、表の多数の行の問合せと更新が行われます。パラレルDMLを使用すると、このような大容量表に対する操作が高速化されます。

8.5.3.1.4 履歴表の更新

履歴表は、最新の時間間隔における企業のビジネス・トランザクションを示します。

DBAは定期的に、この表から最も古い行セットを削除し、新しい行セットを挿入します。パラレルINSERT SELECTおよびパラレルDELETE操作を使用すると、このロールオーバー・タスクが高速化されます。

パーティションの削除を使用して古い行を削除することもできます。ただし、表を日付でパーティション化して、適切な時間間隔を設定する必要があります。

8.5.3.1.5 バッチ・ジョブの実行

業務時間外にOLTPデータベースで実行されるバッチ・ジョブは、ジョブを完了する必要のある時間枠が決まっています。時間どおりに確実にジョブを完了するための最適な手段が、パラレルでの操作の実行です。

ワーク・ロードが増えると、コンピュータ・リソースを追加できます。パラレル操作のスケールアップ・プロパティにより時間制限を守ることができます。

8.5.3.2 パラレルDMLモードの有効化

DML文をパラレル化できるのは、セッションまたはSQL文におけるパラレルDMLを明示的に有効化した場合のみです。

セッションでこのモード有効にするには、次のSQL文を実行します。

ALTER SESSION ENABLE PARALLEL DML;

特定のSQL文でパラレルDMLモードを有効にするには、ENABLE_PARALLEL_DML SQLヒントを含めます。例:

INSERT /*+ ENABLE_PARALLEL_DML */ …

パラレルDMLとシリアルDMLでは、ロック、トランザクションおよびディスク領域の要件が異なるため、このモードが必要になり、パラレルDMLはデフォルト設定によりセッションに対して無効化されています。

パラレルDMLが無効になっていると、PARALLELヒントが使用されてもDMLはパラレルで実行されません。

パラレルDMLがセッションで有効化されていると、そのセッションのすべてのDML文がパラレル実行の対象とみなされます。ENABLE_PARALLEL_DMLヒントを使用してパラレルDMLがSQL文で有効になっている場合、その特定の文のみがパラレル実行の対象として考慮されます。ただし、パラレルDMLが有効になっていても、パラレル・ヒントがない場合や表にパラレル属性がない場合、またはパラレル操作の制限に違反している場合、DML操作はシリアルで実行されます。

セッションのPARALLEL DMLモードはSELECT文、DDL文、およびDML文の問合せ部分の並列処理には影響しません。このモードが設定されていない場合、DML操作はパラレル化されませんが、DML文内のスキャン操作または結合操作はパラレル化されることがあります。

セッションに対してパラレルDMLモードが有効になっている場合、DISABLE_PARALLEL_DML SQLヒントを使用して、特定のSQL文のモードを無効にできます。

詳細は、「パラレルDMLの領域に関する考慮事項」および「パラレルDMLの制限」を参照してください。

8.5.3.3 UPDATE、MERGEおよびDELETEのルール

更新、マージまたは削除操作は、特定の条件下でのみパラレル化されます。

UPDATEMERGEおよびDELETE操作は、次の条件のうち少なくとも1つが満たされている場合のみパラレル化されます。

  • 前のCREATE TABLEまたはALTER TABLE文によって、更新、マージまたは削除の対象となる表にPARALLEL宣言が設定されている。

  • DML文で文レベルまたはオブジェクト・レベルのPARALLELヒントが指定されている。

  • 自動並列度(自動DOP)が有効になっている。

  • ALTER SESSION FORCE PARALLEL DML文を使用してパラレルDMLが強制されている。

文に副問合せまたは更新可能なビューが含まれている場合は、問合せのパラレル化のルールに基づいて、それらもパラレルで実行される可能性があります。UPDATEMERGEおよびDELETE部分のパラレル化の決定は、問合せ部分から独立しており、逆もまた同様です。文レベルのPARALLELヒントまたは自動DOPでは、DML部分と問合せ部分の両方がパラレル化されます。

関連項目:

8.5.3.4 INSERT SELECTのルール

挿入操作は、特定の条件下でのみパラレルで実行されます。

INSERT操作がパラレルで実行されるのは、次の条件のうち少なくとも1つが満たされている場合のみです。

  • 前のCREATE TABLEまたはALTER TABLE文によって、挿入の対象となる表(参照オブジェクト)にPARALLEL宣言が設定されている。

  • DML文でINSERTの後に文レベルまたはオブジェクト・レベルのPARALLELヒントが指定されている。

  • 自動並列度(自動DOP)が有効になっている。

  • ALTER SESSION FORCE PARALLEL DML文を使用してパラレルDMLが強制されている。

INSERT操作のパラレル化の決定は、SELECT操作とは別に行われます。逆の場合も同様です。問合せのパラレル化のルールに基づいて、SELECT操作をパラレル化できます。文レベルのPARALLELヒントまたは自動DOPでは、INSERT操作とSELECT操作の両方がパラレル化されます。

関連項目:

8.5.3.5 パラレルDMLのトランザクション制限

DML操作をパラレルで実行するには、パラレル実行コーディネータがパラレル実行サーバーを取得し、パラレル実行サーバーがそれぞれのパラレル・プロセス・トランザクションで作業の一部を実行します。

次の条件に注意してください。

  • 各パラレル実行サーバーは異なるパラレル・プロセス・トランザクションを生成します。

  • 自動UNDO管理のかわりにロールバック・セグメントを使用する際は、同じロールバック・セグメントに存在するパラレル・プロセス・トランザクションの数を制限することによって、ロールバック・セグメントに対する競合を減らした方がよい場合があります。詳細は、『Oracle Database SQL言語リファレンス』を参照してください。

コーディネータにも独自のコーディネータ・トランザクションがあり、独自のロールバック・セグメントが対応しています。ユーザーレベルのトランザクション原子性を確保するには、コーディネータは2フェーズのコミット・プロトコルを使用して、パラレル・プロセス・トランザクションで実行される変更をコミットします。

パラレルDMLが有効になっているセッションでは、セッションのトランザクションが特殊なモードになる場合があります。トランザクションで任意のDML文が表をパラレルで変更した後、そのトランザクションでは同じ表に対してシリアル問合せ、パラレル問合せまたはDML文で再びアクセスすることはできません。パラレル変更の結果は、そのトランザクション内では確認できません。

同じトランザクション内でパラレルで変更された表に、シリアル文またはパラレル文でアクセスしようとすると、拒否され、エラー・メッセージが返されます。

パラレルDMLが有効になっているセッションでPL/SQLプロシージャまたはブロックが実行される場合、プロシージャまたはブロックの文にはこのルールが適用されます。

8.5.3.6 ロールバック・セグメント

自動UNDO管理のかわりにロールバック・セグメントを使用する場合、パラレルDMLを使用するときにいくつかの制限があります。

関連項目:

パラレルDMLおよびロールバック・セグメントの制限の詳細は、『Oracle Database SQL言語リファレンス』を参照してください

8.5.3.7 パラレルDMLのリカバリ

パラレルDML操作をロールバックするために必要な時間は、フォワード操作の実行にかかる時間とほぼ同じです。

Oracle Databaseでは、トランザクションとプロセスが失敗した後、およびインスタンスとシステムで障害が発生した後のパラレル・ロールバックをサポートしています。Oracle Databaseでは、トランザクション・リカバリのロールフォワード・ステージとロールバック・ステージの両方をパラレル化できます。

関連項目:

パラレル・ロールバックの詳細は、『Oracle Databaseバックアップおよびリカバリ・ユーザーズ・ガイド』を参照してください

8.5.3.7.1 ユーザー発行のロールバックでのトランザクション・リカバリ

文のエラーのためにトランザクションが失敗した際のユーザー発行のロールバックは、パラレル実行コーディネータとパラレル実行サーバーによってパラレルで実行されます。

このロールバックには、フォワード・トランザクションとほぼ同じ時間がかかります。

8.5.3.7.2 プロセス・リカバリ

パラレル実行コーディネータまたはパラレル実行サーバーの障害からのリカバリは、PMONプロセスによって実行されます。

パラレル実行サーバーまたはパラレル実行コーディネータで障害が発生すると、PMONによってそのプロセスの作業がロールバックされ、トランザクションの他のすべてのプロセスによってその変更内容がロールバックされます。

8.5.3.7.3 システム・リカバリ

システム障害のリカバリでは新規起動が必要です。

リカバリは、SMONプロセスとSMONで生成されるすべてのリカバリ・サーバー・プロセスによって実行されます。パラレルDML文はパラレル・ロールバックを使用してリカバリできます。初期化パラメータCOMPATIBLEが8.1.3以上に設定されている場合は、ファスト・スタート・オン・デマンド・ロールバックによって、中止されたトランザクションを1回に1ブロックずつオンデマンドでリカバリできます。

8.5.3.8 パラレルDMLの領域に関する考慮事項

パラレルUPDATEではオブジェクト内の既存の空き領域が使用されますが、ダイレクト・パスINSERTではデータのために新しいエクステントが取得されます。

パラレル実行では複数の同時子トランザクションがオブジェクトを変更するため、領域使用の特徴がシリアル実行と異なることがあります。

8.5.3.9 パラレルDMLの制限

パラレルDMに適用されるいくつかの制限事項があります。

パラレルDML(ダイレクト・パスINSERTを含む)には次の制限が適用されます。

  • UPDATEMERGEおよびDELETE操作のイントラ・パーティション並列化を行うには、COMPATIBLE初期化パラメータを9.2以上に設定する必要があります。

  • INSERT VALUES文はパラレルで実行されません。

  • 1つのトランザクションには、様々な表を変更する複数のDML文が含まれる場合があります。ただし、パラレルDML文で1つの表が変更された後、後続のシリアル文またはパラレル文(DMLまたは問合せ)が、そのトランザクション内で同じ表に再度アクセスすることはできません。

    • シリアル・ダイレクト・パスINSERT文の後にもこのような制限があります。同じトランザクションでは、変更された表に後続のSQL文(DMLまたは問合せ)がアクセスできません。

    • 同じ表にアクセスする問合せが許可されるのは、パラレルDMLまたはダイレクト・パスINSERT文の前であり、後には許可されません。

    • シリアル文またはパラレル文が、パラレルUPDATEDELETEまたはMERGE、あるいはダイレクト・パスINSERTによって同じトランザクションで変更された表にアクセスしようとすると拒否され、エラー・メッセージが返されます。

  • パラレルDML操作は、トリガーを含む表に対しては実行できません。

  • レプリケーション機能はパラレルDMLに対してはサポートされません。

  • パラレルDMLは、自己参照型整合性、削除カスケードおよび遅延整合性の制約がある場合には実行されません。また、ダイレクト・パスINSERTではすべての参照整合性がサポートされません。

  • オブジェクト列を含む表に対してパラレルDMLを実行できますが、それはオブジェクト列にアクセスしない場合です。

  • LOB列を含む表に対してパラレルDMLを実行できますが、それは表がパーティション化されている場合です。ただし、イントラ・パーティション並列処理はサポートされません。

    LOB列を含む非パーティション化表では、LOB列がSecureFiles LOBとして宣言される場合に、パラレルのINSERT操作がサポートされます。パラレルのUPDATEDELETEおよびMERGE操作は、そのような表に対してはサポートされません。

  • DML操作が分散トランザクションに含まれる場合、またはDMLまたは問合せ操作の対象がリモート・オブジェクトである場合、そのDML操作はパラレルで実行できません。

  • クラスタ化表がサポートされていません。

  • パラレルのUPDATEDELETEおよびMERGE操作は、一時表に対してはサポートされません。

  • 表がパーティション化されていない場合、パラレルDMLは、ビットマップ索引を使用した表でサポートされません。

これらの制限に違反すると文がシリアルで実行されます。警告またはエラー・メッセージは返されません(トランザクション内で同じ表にアクセスする文に関する制限を除きます。この場合はエラー・メッセージが生成されます)。

8.5.3.9.1 パーティション化キーの制限

パーティション表のパーティション化キーを新しい値に更新できるのは、更新によってその行が新しいパーティションに移動されない場合のみです。

表定義で行移動の句が有効になっている場合は更新が可能です。

8.5.3.9.2 関数の制限

パラレルDMLの関数の制限は、パラレルDDLおよびパラレル問合せの関数の制限と同じです。

詳細は、「関数のパラレル実行について」を参照してください。

8.5.3.10 データ整合性の制限

このトピックでは、整合性制約とパラレルDML文の相互作用について説明します。

この項の内容は次のとおりです。

8.5.3.10.1 NOT NULLおよびCHECK

このトピックでは、NOT NULLおよびCHECKの整合性制約について説明します。

NOT NULLおよびCHECKの整合性制約は許可されます。列レベルおよび行レベルそれぞれで施行されるため、パラレルDMLでは問題になりません。

8.5.3.10.2 UNIQUEおよびPRIMARY KEY

このトピックでは、UNIQUEおよびPRIMARY KEYの整合性制約について説明します。

UNIQUEおよびPRIMARY KEYの整合性制約は許可されます。

8.5.3.10.3 FOREIGN KEY(参照整合性)

参照整合性の制限が発生するのは、ある表に対するDML操作が別の表に対して再帰的なDML操作を引き起こす可能性があるときです。

整合性チェックを実行するために、変更対象のオブジェクトに行われるすべての変更を同時に確認する必要がある場合にも、この制限が適用されます。

表8-1に、参照整合性制約に関連する表に対して実行可能なすべての操作を示します。

表8-1 参照整合性の制限

DML文 親での発行 子での発行 自己参照型

INSERT

(該当せず)

パラレル化なし

パラレル化なし

MERGE

(該当せず)

パラレル化なし

パラレル化なし

UPDATE No Action

サポートされている

サポートされている

パラレル化なし

DELETE No Action

サポートされている

サポートされている

パラレル化なし

DELETE Cascade

パラレル化なし

(該当せず)

パラレル化なし

8.5.3.10.4 削除カスケード

このトピックでは、削除カスケード・データ整合性制限について説明します。

外部キーを含む表に対する削除カスケードを使用した削除はパラレル化されません。パラレル実行サーバーが、複数のパーティション(親表および子表)から行を削除しようとするためです。

8.5.3.10.5 自己参照型整合性

自己参照型整合性制約のある表に対するDMLは、参照されるキー(主キー)に関係する場合はパラレル化されません。

その他すべての列に対するDMLでは並列処理が可能です。

8.5.3.10.6 遅延可能整合性制約

このトピックでは、遅延可能整合性制約について説明します。

操作対象の表に遅延可能制約が適用される場合、DML操作はパラレルで実行されません。

8.5.3.11 トリガーの制限

影響する表に有効なトリガーが含まれており、DML文の結果によってトリガーが起動される可能性がある場合、そのDML操作はパラレルで実行されません。

つまり、レプリケート中の表に対するDML文はパラレル化されません。

表に対するDMLをパラレル化するには関連するトリガーを無効にしておく必要があります。トリガーを有効または無効にすると、従属する共有カーソルが無効化されます。

8.5.3.12 分散トランザクションの制限

このトピックでは、分散トランザクションの制限について説明します。

DML操作が分散トランザクションに含まれる場合、またはDMLまたは問合せ操作の対象がリモート・オブジェクトである場合、そのDML操作はパラレルで実行できません。

8.5.3.13 分散トランザクション並列処理の例

このトピックでは、分散トランザクション処理の例をいくつか説明します。

最初の例では、DML文がリモート・オブジェクトを問い合せます。DML操作はリモート・オブジェクトを参照しているため、通知なくシリアルで実行されます。

INSERT /*+ APPEND PARALLEL (t3,2) */ INTO t3 SELECT * FROM t4@dblink;

次の例では、DML操作がリモート・オブジェクトに適用されます。DELETE操作はリモート・オブジェクトを参照しているため、パラレル化されません。

DELETE /*+ PARALLEL (t1, 2) */ FROM t1@dblink;

最後の例では、DML操作が分散トランザクションに含まれます。DELETE操作は分散トランザクション(SELECT文によって開始される)で実行されるため、パラレルで実行されません。

SELECT * FROM t1@dblink; 
 DELETE /*+ PARALLEL (t2,2) */ FROM t2;
 COMMIT; 

8.5.3.14 UNION ALLの同時実行

UNIONUNION ALLなどの集合演算子は、単一のSQL文に結合される複数の問合せ(分岐)で構成されます。

従来、集合演算子は順に処理されます。個々の分岐をシリアルまたはパラレルで処理できますが、一度に1つの分岐のみで順に処理されます。この方法は多くのユースケースを満たしますが、UNIONまたはUNION ALL文の複数の分岐の処理を同時に実行する状況があります。ほとんどの一般的な状況は、複数またはすべての分岐がリモートのSQL文である場合です。この状況では、すべての参加するリモート・システムの同時処理は、参加するシステムのワークロードを増やさずに処理時間全体の処理速度を上げるよう求められます。

UNIONまたはUNION ALL文の同時実行のデフォルト動作は、OPTIMIZER_FEATURES_ENABLE初期化パラメータの設定によって制御されます。12.1.0.1以上に設定すると、同時実行がデフォルトで有効になります。少なくとも1つの分岐の文がローカルでパラレルの処理が考慮される文は、UNIONまたはUNION ALL文全体も同時に処理されます。システムは個々のローカル分岐の文のDOPを計算し、UNIONまたはUNION ALL文全体の実行のDOPの最大値を選択します。次に、システムは、パラレルで処理される分岐のパラレル化およびシリアルおよびリモート文の同時ワーカーに選択されたDOPを使用して、できるだけ多くの分岐を同時に処理します。

OPTIMIZER_FEATURES_ENABLE初期化パラメータが12.1.0.1より小さい値に設定されている場合、UNIONまたはUNION ALL文の同時実行は、PQ_CONCURRENT_UNIONヒントを使用して明示的に有効にする必要があります。

ただし、1つずつの分岐の連続処理とは異なり、同時処理は個々の分岐の結果の順序付けられた戻りを保証しません。1つずつの分岐の順序付けられた戻りが必要な場合、NO_PQ_CONCURRENT_UNIONヒントを使用して同時処理を無効にするか、SQL文を拡張して個々の分岐の文を一意に識別してその指定された識別子でソートする必要があります。

特にPQ_CONCURRENT_UNIONヒントを使用しないかぎり、シリアルまたはリモート分岐のみで構成されるUNIONまたはUNION ALL文は同時に処理されません。このSQL文のDOPは、最大でシリアルおよびリモート入力の数です。

UNIONまたはUNION ALL文の同時処理が発生するかどうかは、SQL文の実行計画で簡単に識別できます。パラレルで実行される場合、シリアルおよびリモート分岐の実行は、PX SELECTORとして識別可能な行ソースで管理されます。同時に処理されない文は、シリアルおよびリモート分岐のコーディネータとして問合せコーディネータ(QC)を示します。

例8-4では、SQL文はローカルおよびリモート分岐で構成されています。SQL文は、ローカル・データベースのゴールドおよびプラチナ顧客の情報およびリモート・データベースの3つの主要都市の顧客の情報をロードします。ローカルSELECT文がパラレルで発生するため、この処理はパラレルで自動的に実行されます。各シリアル分岐は、1つのパラレル実行サーバー・プロセスのみによって実行されます。各パラレル実行サーバーは1つのシリアル分岐を実行できるため、同時に実行されます。

例8-4 UNION ALLの実行計画

SQL> EXPLAIN PLAN FOR INSERT INTO all_customer 
  SELECT * FROM GOLD_customer UNION ALL 
  SELECT * FROM PLATINUM_customer UNION ALL 
  SELECT * FROM SF_customer@san_francisco UNION ALL 
  SELECT * FROM LA_customer@los_angeles UNION ALL 
  SELECT * FROM LV_customer@las_vegas;
-------------------------------------------------------------------------------
| Id | Operation              | Name          | TQ/Ins |IN-OUT | PQ Distrib|
-------------------------------------------------------------------------------
| 0 | INSERT STATEMENT         |              |        |       |           |
| 1 |  LOAD TABLE CONVENTIONAL | ALL_CUSTOMER |        |       |           |
| 2 |   PX COORDINATOR         |              |        |       |           |
| 3 |    PX SEND QC (RANDOM)   | :TQ10003     |        | P->S  | QC (RAND) |
| 4 |     UNION-ALL            |              |        | PCWP  |           |
| 5 |      PX BLOCK ITERATOR   |              |        | PCWC  |           |
| 6 |       TABLE ACCESS FULL  | GOLD_CUSTOMER|        | PCWP  |           |
| 7 |      PX BLOCK ITERATOR   |              |        | PCWC  |           |
| 8 |       TABLE ACCESS FULL  | PLATINUM_CUST|        | PCWP  |           |
| 9 |      PX SELECTOR         |              |        | PCWP  |           |
|10 |       REMOTE             | SF_CUSTOMER  |        | PCWP  |           |
|11 |      PX SELECTOR         |              |        | PCWP  |           |
|12 |       REMOTE             | LA_CUSTOMER  |        | PCWP  |           |
|13 |      PX SELECTOR         |              |        | PCWP  |           |
|14 |       REMOTE             | LV_CUSTOMER  |        | PCWP  |           |
-------------------------------------------------------------------------------

8.5.4 関数のパラレル実行について

SQL文には、PL/SQLまたはJavaで作成したユーザー定義関数、あるいはC言語で作成した外部プロシージャとしてのユーザー定義関数を含めることができます。これらは、SELECTリスト、SET句またはWHERE句に指定できます。

SQL文がパラレル化されると、このような関数はパラレル実行サーバー・プロセスによって1行ずつ実行されます。関数で使用されるPL/SQLパッケージ変数またはJava静的属性は、完全に個々のパラレル実行プロセスのみで使用され、元のセッションからコピーされるのではなく各行が処理されるたびに新たに初期化されます。この処理のため、パラレルで実行した場合、すべての関数によって正しい結果が生成されるとはかぎりません。

ユーザーが作成した表関数を文のFROMリストに指定できます。このような関数は、行出力を生成するためソース・テーブルのように機能します。表関数はその文で1回、各パラレル実行プロセスの開始時に初期化されます。すべての変数は、対応するパラレル実行プロセスでしか使用されません。

この項では、次の項目について説明します。

8.5.4.1 パラレル問合せでの関数

ユーザー関数は、SQL問合せ文またはDMLまたはDDL文の副問合せでパラレルで実行できます。

SELECT文、あるいはDMLまたはDDL文の副問合せでは、次の場合にユーザー作成関数がパラレルで実行されることがあります。

  • PARALLEL_ENABLEキーワードで宣言された場合。

  • パッケージまたはタイプで宣言され、PRAGMA RESTRICT_REFERENCES句にWNDSRNPSおよびWNPSのすべてが指定された場合。

  • CREATE FUNCTIONで宣言され、システムがPL/SQLコードの本体を分析して、コードがデータベースに書き込まず、パッケージ変数の読取りや変更も行わないことを判別できた場合。

関数の実行をシリアルで行うことが必要な場合でも、問合せまたは副問合せの他の部分はパラレルで実行されることがあります。

関連項目:

8.5.4.2 パラレルDMLおよびDDL文での関数

ユーザー関数は、特定の条件下でDMLまたはDDL文で実行できます。

パラレルDMLまたはDDL文においても、パラレル問合せと同じく、次の場合にユーザー作成関数がパラレルで実行されることがあります。

  • PARALLEL_ENABLEキーワードで宣言された場合。

  • パッケージまたはタイプで宣言され、PRAGMA RESTRICT_REFERENCES句にRNDSWNDSRNPSおよびWNPSのすべてが指定された場合。

  • CREATE FUNCTION文で宣言され、システムがPL/SQLコードの本体を分析して、コードがデータベースに読取りや書込みを行わず、パッケージ変数の読取りや変更も行わないことを判別できた場合。

パラレルDML文の場合、パラレルで実行できない関数コールが含まれていると、そのDML文全体がシリアルで実行されます。INSERT SELECT文またはCREATE TABLE AS SELECT文の場合は、ここで説明したパラレル問合せルールに従って、問合せ部分の関数コールはパラレル化されます。文のその他の部分をシリアルで実行する必要があっても、問合せはパラレル化できます。または、その逆の場合もあります。

8.5.5 その他の並列処理の種類について

Oracle Databaseは、複数の操作タイプでパラレル処理を使用できます。

パラレルSQL実行の他に、Oracle Databaseは次の操作について並列処理を使用できます。

  • パラレル・リカバリ

  • パラレル伝播(レプリケーション)

  • パラレル・ロード(外部表およびSQL*Loaderユーティリティ)

パラレルSQLと同じく、 パラレル・リカバリ、パラレル伝播およびパラレル外部表ロードは、パラレル実行コーディネータと複数のパラレル実行サーバーによって実行されます。ただし、SQL*Loaderを使用したパラレル・ロードでは異なるメカニズムが使用されます。

パラレル実行コーディネータとパラレル実行サーバーの動作は、実行する操作の種類(SQL、リカバリまたは伝播)に応じて変わることがあります。たとえば、プールのすべてのパラレル実行サーバーが占有されており、最大数のパラレル実行サーバーが起動されている場合は、次のようになります。

  • パラレルSQLおよび外部表ロードでは、パラレル実行コーディネータがシリアル処理に切り替えます。

  • パラレル伝播では、パラレル実行コーディネータがエラーを返します。

1つのセッションで、パラレル実行コーディネータは1種類の操作のみを調整します。たとえば、パラレル実行コーディネータは、パラレルSQLとパラレル・リカバリまたはパラレル伝播を同時に調整することはできません。

関連項目:

8.5.6 SQL文の並列度ルール

SQL文のパラレル化決定には、パラレル化の決定と並列度(DOP)という2つの要素があります。

これらの要素の決定方法は、問合せ、DDL操作およびDML操作で異なります。

次の各項で、並列度について説明します。

各種SQL文の並列度は、文レベルまたはオブジェクト・レベルのPARALLELヒント、PARALLEL句、ALTER SESSION FORCE PARALLEL文、自動並列度(自動DOP)、または表や索引のPARALLEL宣言によって決定できます。これらの方法のうち複数を使用する場合、Oracle Databaseでは、優先順位ルールを使用して、DOPの決定に使用する方法が決定されます。

表8-2には、各種SQL文の並列度(DOP)を決定するための優先順位ルールを示します。この表では、方法の優先順位番号が小さいほうが、大きい番号よりも優先されます。たとえば、優先度(1)は、優先度(2)、優先度(3)、優先度(4)および優先度(5)よりも優先されます。

表8-2 パラレル化の優先順位

パラレル操作 文レベルのPARALLELヒント オブジェクト・レベルのPARALLELヒント PARALLEL句 ALTER SESSION 自動DOP パラレル宣言

パラレル問合せ表/索引スキャン。詳細は、問合せのパラレル化のルールを参照してください。

優先度(1)

優先度(2)

該当なし

優先度(3) FORCE PARALLEL QUERY

優先度(4)

優先度(5)

パラレルUPDATEDELETEまたはMERGE。詳細は、UPDATE、MERGEおよびDELETEのルールを参照してください。

優先度(1)

優先度(2)

該当なし

優先度(3) FORCE PARALLEL DML

優先度(4)

優先度(5)のターゲット表

パラレルINSERT... SELECTINSERT操作。詳細は、INSERT SELECTのルールを参照してください。

優先度(1)

優先度(2)

該当なし

優先度(3) FORCE PARALLEL DML

優先度(4)

挿入対象となる優先度(5)の表

INSERTがシリアルの場合の、INSERT SELECTSELECT操作。詳細は、INSERT SELECTのルールを参照してください。

優先度(1)

優先度(2)

該当なし

優先度(3) FORCE PARALLEL QUERY

優先度(4)

選択対象となる優先度(5)の表

パラレルCREATE TABLE AS SELECTCREATE操作(パーティション表または非パーティション表)詳細は、CREATE TABLE AS SELECTのルールを参照してください。

優先度(1)

該当なし

優先度(4)

優先度(2) FORCE PARALLEL DDL

優先度(3)

該当なし

CREATEがシリアルの場合の、CREATE TABLE AS SELECTSELECT操作。詳細は、CREATE TABLE AS SELECTのルールを参照してください。

優先度(1)

優先度(2)

該当なし

優先度(3) FORCE PARALLEL QUERY

優先度(4)

優先度(5)

その他のDDL操作。詳細は、DDL文のルールを参照してください。

該当なし

該当なし

優先度(3)

優先度(1) FORCE PARALLEL DDL

優先度(2)

該当なし

関連項目: