SELECT
文でパラレル問合せとパラレル副問合せを使用できます。DDL文とDML文(INSERT
、UPDATE
およびDELETE
)の問合せ部分もパラレルで実行できます。また、外部表をパラレルで問い合せることもできます。
パラレル化の2つの要素は、パラレル化の決定と並列度(DOP)です。これらの要素の決定方法は、問合せ、DDL操作およびDML操作で異なります。DOPを決定するときに、Oracle Databaseは次の参照オブジェクトを調べます。
パラレル問合せは、パラレルで実行される問合せの部分で、それぞれの表および索引を調べて、どれが参照表かを決定します。原則として、最大のDOPが設定された表または索引を選択します。
パラレルDML(INSERT
、UPDATE
、MERGE
およびDELETE
)では、DOPを決定する参照オブジェクトは、挿入、更新または削除操作によって変更される表です。パラレルDMLではデッドロックを防ぐためにDOPに制限が課せられます。パラレルDML文に副問合せが含まれる場合、副問合せのDOPはDML操作のDOPと同じになります。
パラレルDDLでは、DOPを決定する参照オブジェクトは、作成、再構築、分割または移動される表、索引またはパーティションです。パラレルDDL文に副問合せが含まれる場合、副問合せのDOPはDDL操作と同じになります。
この項の内容は次のとおりです。
Oracle Databaseでパラレルで実行できる問合せ操作の詳細は、「パラレル実行を使用できる操作」を参照してください。パラレル問合せがプロセスで実行される方法の詳細は、「SQL文のパラレル実行」を参照してください。リモート・オブジェクトを参照する問合せの例は、「分散トランザクションの制限」を参照してください。問合せをパラレルで実行するための条件とDOPを決定する要素の詳細は、「問合せのパラレル化のルール」を参照してください。
索引構成表では次のパラレル・スキャン方法がサポートされています。
非パーティション索引構成表のパラレル高速全スキャン
パーティション索引構成表のパラレル高速全スキャン
パーティション索引構成表のパラレル索引レンジ・スキャン
これらのスキャン方法は、オーバーフロー領域を含む索引構成表およびLOBを含む索引構成表に対して使用できます。
非パーティション索引構成表に対するパラレル問合せでは、パラレル高速全スキャンが使用されます。DOPが決定される要素は、優先順位の高い順に次のとおりです。
PARALLEL
ヒント(指定されている場合)
ALTER
SESSION
FORCE
PARALLEL
QUERY
文
表に関連付けられている並列度(並列度がCREATE
TABLE
またはALTER
TABLE
文に指定されている場合)
作業の割当ては、索引セグメントを十分な数のブロック・レンジに分割し、ブロック・レンジをデマンドドリブン方式でパラレル実行サーバーに割り当てることで行われます。任意の行に対応するオーバーフロー・ブロックは、その行を所有するプロセスによってのみデマンドドリブン方式でアクセスされます。
索引レンジ・スキャンと高速全スキャンの両方をパラレルで実行できます。パラレル高速全スキャンでは、パラレル化は非パーティション索引構成表の場合と同じです。パーティション索引構成表に対するパラレル索引レンジ・スキャンの場合、DOPは、前の優先順位リストから取得される並列度(パラレル高速全スキャンと同様)と索引構成表のパーティション数の小さい方の値です。DOPによって異なりますが、各パラレル実行サーバーは、1つ以上のパーティションを取得します。各パーティションは、主キー索引セグメントと関連するオーバーフロー・セグメント(ある場合)を含みます。
パラレル問合せを、オブジェクト型の表およびオブジェクト型の列を含む表に実行することができます。オブジェクト型に対するパラレル問合せでは、オブジェクト型に対する順次問合せで使用できるすべての機能がサポートされます。
オブジェクト型に対するメソッド
オブジェクト型の属性アクセス
オブジェクト型インスタンスを作成するためのコンストラクタ
オブジェクト・ビュー
オブジェクト型に対するPL/SQLおよびOracle Call Interface (OCI)問合せ
パラレル問合せではオブジェクト型のサイズの制限はありません。
オブジェクト型に対してパラレル問合せを使用する際には次の制限が適用されます。
結合とソート(ORDER
BY
、GROUP
BY
または集合演算による)を含む問合せをパラレルで実行するにはMAP
関数が必要です。MAP
関数がない場合、問合せは自動的にシリアルで実行されます。
これらいずれかの制限のために問合せをパラレルで実行できない場合は、常に問合せ全体がシリアルで実行されエラー・メッセージは返されません。
ここでは、問合せをパラレルで実行するためのルールについて説明します。
SELECT
文をパラレルで実行できるのは、次の条件が満たされる場合のみです。
問合せにパラレル・ヒントの指定(PARALLEL
またはPARALLEL_INDEX
)が含まれるか、問合せで参照されているスキーマ・オブジェクトにPARALLEL
宣言が関連付けられている。
問合せに指定された少なくとも1つの表で次のいずれかが必要である。
全表スキャン
複数パーティションに及ぶ索引レンジ・スキャン
スカラー副問合せがSELECT
リストにない。
問合せのDOPは次のルールによって決まります。
問合せは、問合せに関連する表宣言のすべて、および問合せの回答を得られる可能性のある索引すべて(参照オブジェクト)の中で最大のDOPを使用します。つまり、最大のDOPが設定された表または索引によって、問合せのDOPの最大問合せディレクティブが決まります。
表に関して、問合せでのパラレル・ヒント指定と表指定でのパラレル宣言の両方がある場合、ヒント指定がパラレル宣言指定よりも優先されます。優先順位のルールは表8-2を参照してください。
ここでは、DDL文の並列処理に関する次の項目について説明します。
表および索引(パーティションまたは非パーティション)に対するDDL文をパラレルで実行できます。表8-2に、パラレルで実行できるDDL文の操作をまとめています。
非パーティション表および非パーティション索引のパラレルDDL文は次のとおりです。
CREATE
INDEX
CREATE
TABLE
... AS
SELECT
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
句の有無にかかわらずパラレルで実行できます。
別の操作には別の並列処理が使用されます(表8-2を参照)。パーティション表のCREATE
TABLE
... AS
SELECT
文とパーティション索引のパラレルCREATE
INDEX
文は、パーティション数と等しいDOPで実行されます。
パラレルDDLは、オブジェクト列を含む表では実行できません。パラレルDDLは、LOB
列を含む非パーティション表では実行できません。
パラレル実行により、問合せと表作成操作(別の表または一連の表に対する副問合せを使用した表の作成)をパラレルで実行できます。これは、サマリー表またはロールアップ表を作成する場合に大変便利です。
クラスタ表の作成と移入をパラレルで行うことはできません。
図8-4に、パラレルでの副問合せを使用したサマリー表の作成を示します。
パラレルDDLは、サマリー表の作成や、スタンドアロン・トランザクションである大量データ・ロードの実行(必ずしもリカバリ可能でなくてもよい)によく使用されます。Oracle DatabaseロギングをオフにするとUNDOログまたはREDOログは生成されないため、パラレルDML操作のパフォーマンスは多くの場合向上しますがオールオアナッシング操作になります。つまり、操作がなんらかの理由で失敗した場合、操作を完全にやりなおす必要があります。再開することはできません。
パラレル表作成(またはその他のパラレルDDL操作)時にロギングを無効化する場合は、メディア障害による表の損失を防ぐために、表が作成されてからその表を含む表領域をバックアップする必要があります。
UNDOログおよびREDOログの生成を無効にするには、CREATE
TABLE
、CREATE
INDEX
、ALTER
TABLE
およびALTER
INDEX
文でNOLOGGING
句を使用します。
表または索引をパラレルで作成するとき、各パラレル実行サーバーはCREATE
文のSTORAGE
句の値を使用して、行を格納するための一時セグメントを作成します。このため、NEXT
設定が4MB、PARALLEL
DEGREE
が16で作成される表は、作成時に少なくとも64MBの記憶域を消費します。各パラレル・サーバー・プロセスが4MBのエクステントで開始するためです。パラレル実行コーディネータがセグメントを結合するときに、セグメントの一部が切り捨てられ、生成される表はリクエストの64MBよりも小さくなることがあります。
索引と表をパラレルで作成するとき、各パラレル実行サーバーが新しいエクステントを割り当て、エクステントに表または索引のデータを格納します。したがって、DOPを4として索引を作成する場合、索引には最初の時点で少なくとも4つのエクステントがあります。このエクステントの割当ては、パラレルでの索引再構築の場合や、パラレルでのパーティションの移動、分割または再構築の場合と同様に行われます。
シリアル操作では、スキーマ・オブジェクトに少なくとも1つのエクステントが必要です。パラレル作成では、表または索引に、スキーマ・オブジェクトを作成するパラレル実行サーバーと同数のエクステントがあることが必要です。
表または索引をパラレルで作成するとき、空き領域が作成されることがあります。これは、パラレル実行サーバーで使用される一時セグメントが、行の格納に必要なサイズよりも大きい場合に発生します。
各一時セグメント内の未使用領域が、表領域レベルで設定されたMINIMUM
EXTENT
パラメータの値よりも大きい場合、Oracle Databaseがすべての一時セグメントの行を表または索引にマージするときに未使用領域を切り捨てます。未使用領域はシステムの空き領域に戻され、新しいエクステント用に割り当てることができます。ただし、連続した領域ではないため、結合してより大きいセグメントにすることはできません(外部断片化)。
各一時セグメントの未使用領域がMINIMUM
EXTENT
パラメータの値よりも小さい場合は、一時セグメントの行をマージするときに未使用領域を切り捨てることはできません。この未使用領域はシステムの空き領域に戻されません。表または索引の一部として残り(内部断片化)、後から行われる挿入や追加領域を必要とする更新のためにのみ使用されます。
たとえば、CREATE
TABLE
... AS
SELECT
文でDOPを3と指定したが、表領域には1つしかデータファイルがない場合、図8-5に示すように内部断片化が発生することがあります。データファイルの内部表エクステント内の空き領域を他の空き領域と結合して、エクステントとして割り当てることはできません。
パラレルでの表および索引作成の詳細は、『Oracle Databaseパフォーマンス・チューニング・ガイド』を参照してください。
DDL文をパラレル化するときは次の項目に注意してください。
DDL操作をパラレルで実行できるのは、PARALLEL
句(宣言)が構文に指定される場合です。CREATE
INDEX
およびALTER
INDEX
... REBUILD
またはALTER
INDEX
... REBUILD
PARTITION
の場合、パラレル宣言はデータ・ディクショナリに格納されます。
ALTER
SESSION
FORCE
PARALLEL
DDL
文を使用すると、セッションの後続のDDL文のパラレル句を上書きできます。
DOPは、ALTER
SESSION
FORCE
PARALLEL
DDL
文によって上書きされないかぎり、PARALLEL
句の指定によって決まります。パーティション索引の再構築がパラレルで実行されることはありません。
CREATE
TABLE
文およびALTER
TABLE
文のパラレル句によって表の並列処理が指定されます。パラレル句が表定義に存在する場合は、それによってDDL文および問合せの並列処理が決まります。ただし、DDL文に表に対する明示的なパラレル・ヒントがある場合、その表のパラレル句の効果よりもヒントが優先されます。ALTER
SESSION
FORCE
PARALLEL
DDL
文を使用して、パラレル句を上書きできます。
索引の作成と変更のルールについて次の項目で説明します。
CREATE
INDEX
文とALTER
INDEX
... REBUILD
文は、PARALLEL
句またはALTER
SESSION
FORCE
PARALLEL
DDL
文によってのみパラレル化できます。
ALTER
INDEX
... REBUILD
文をパラレル化できるのは非パーティション索引の場合のみですが、ALTER
INDEX
... REBUILD
PARTITION
はPARALLEL
句またはALTER
SESSION
FORCE
PARALLEL
DDL
文を使用してパラレル化できます。
ALTER
INDEX
... REBUILD
(非パーティション化)、ALTER
INDEX
... REBUILD
PARTITION
およびCREATE
INDEX
のスキャン操作は、REBUILD
操作またはCREATE
操作と同じ並列処理になり、同じDOPを使用します。DOPがREBUILD
またはCREATE
に指定されない場合、デフォルトはCPUの数です。
CREATE
TABLE
... AS
SELECT
文には、CREATE
部分(DDL)とSELECT
部分(問合せ)の2つの部分があります。Oracle Databaseではこの文の両方の部分をパラレル化できます。CREATE
部分は他のDDL操作と同じルールに従います。
この項の内容は次のとおりです。
CREATE
TABLE
... AS
SELECT
文の問合せ部分をパラレル化できるのは、次の条件が満たされる場合のみです。
問合せにパラレル・ヒントの指定(PARALLEL
またはPARALLEL_INDEX
)が含まれるか問合せに指定された少なくとも1つの表で、全表スキャンまたは複数のパーティションに及ぶ索引レンジ・スキャンが必要である。、文のCREATE
部分にPARALLEL
句が指定されているか、問合せで参照されているスキーマ・オブジェクトにPARALLEL
宣言が関連付けられている。
問合せに指定された少なくとも1つの表で、全表スキャンまたは複数のパーティションに及ぶ索引レンジ・スキャンが必要である。
CREATE
TABLE
... AS
SELECT
文の問合せ部分のDOPは、次のいずれかのルールによって決まります。
問合せ部分は、CREATE
部分のPARALLEL
句に指定された値を使用します。
PARALLEL
句が指定されない場合、デフォルトDOPはCPUの数です。
CREATE
がシリアルな場合、DOPは問合せによって決まります。
並列処理のヒントに指定される値はすべて無視されるので注意してください。
CREATE
TABLE
... AS
SELECT
のCREATE
操作は、PARALLEL
句またはALTER
SESSION
FORCE
PARALLEL
DDL
文によってのみパラレル化できます。
CREATE
TABLE
... AS
SELECT
のCREATE
操作がパラレル化されるとき、可能であればスキャン操作もパラレル化されます。スキャン操作をパラレル化できないのは次のような場合です。
SELECT
句にNO_PARALLEL
ヒントがある場合。
操作によって非パーティション表の索引がスキャンされる場合。
CREATE
操作がパラレル化されないとき、SELECT
をパラレル化できるのは、PARALLEL
ヒントがある場合、または選択される表(またはパーティション索引)にパラレル宣言がある場合です。
CREATE
操作およびSELECT
操作(パラレル化される場合)のDOPは、ALTER
SESSION
FORCE
PARALLEL
DDL
文によって上書きされないかぎり、CREATE
文のPARALLEL
句によって指定されます。PARALLEL
句でDOPが指定されない場合、デフォルトはCPUの数です。
パラレルDML(PARALLEL
INSERT
、UPDATE
、DELETE
およびMERGE
)は、パラレル実行メカニズムを使用して、大規模なデータベース表や索引に対する大規模なDML操作を高速化または拡張します。
注意: 通常、DMLには問合せが含まれますが、この章ではDMLという語はINSERT 、UPDATE 、MERGE およびDELETE 操作のみを指すものとして使用しています。 |
ここでは、パラレルDMLの次の項目について説明します。
パラレルDMLが役立つのは、大容量オブジェクトにアクセスする際のパフォーマンスとスケーラビリティが重要になる意思決定支援システム(DSS)環境です。パラレルDMLは、DSSデータベースのための問合せ機能と更新機能の両方を提供し、パラレル問合せを補います。
並列処理の設定に伴うオーバーヘッドのため、パラレルDML操作は短時間のOLTPトランザクションでの実行には適していません。ただし、パラレルDML操作を使用してOLTPデータベースでのバッチ・ジョブの実行を高速処理することができます。
パラレルDMLが使用されるシナリオの一部を次に示します。
データ・ウェアハウス・システムでは、大容量の表を本番システムの新規データまたは変更データで定期的にリフレッシュ(更新)する必要があります。MERGE
文を使用すると、これを効率よく実行できます。
DSS環境では、多くのアプリケーションで、多数の大容量中間サマリー表の作成や操作を行う複雑な計算が必要です。このようなサマリー表は多くの場合は一時的に使用され、ロギングする必要がないものが大半です。パラレルDMLを使用すると、このような大容量中間表に対する操作が高速化されます。メリットの1つは、増分結果を中間表に格納して、パラレル更新を実行できることです。
また、サマリー表には、アプリケーション・セッションが終了しても保存する必要がある累積情報または比較情報が含まれる場合もあります。つまり、一時表は使用できません。パラレルDML操作を使用すると、このような大容量サマリー表に対する変更が高速化されます。
多くのDSSアプリケーションは、一連の基準に基づいて定期的に顧客をスコアリングしています。通常、スコアは大容量のDSS表に格納されます。その後、スコア情報は意思決定(たとえばメーリング・リストへの指定)で使用されます。
このようなスコアリング・アクティビティでは、表の多数の行の問合せと更新が行われます。パラレルDMLを使用すると、このような大容量表に対する操作が高速化されます。
履歴表は、最新の時間間隔における企業のビジネス・トランザクションを示します。DBAは定期的に、この表から最も古い行セットを削除し、新しい行セットを挿入します。パラレルINSERT
... SELECT
およびパラレルDELETE
操作を使用すると、このロールオーバー・タスクが高速化されます。
パーティションの削除を使用して古い行を削除することもできます。ただし、こ表を日付でパーティション化して、適切な時間間隔を設定する必要があります。
DML文をパラレル化できるのは、セッションにおけるパラレルDMLを明示的に有効化した場合のみです。たとえば、次の文について考えてみます。
ALTER SESSION ENABLE PARALLEL DML;
パラレルDMLとシリアルDMLでは、ロック、トランザクションおよびディスク領域の要件が異なるため、このモードが必要になり、パラレルDMLはデフォルト設定によりセッションに対して無効化されています。
パラレルDMLが無効になっていると、PARALLEL
ヒントが使用されてもDMLはパラレルで実行されません。
パラレルDMLがセッションで有効化されていると、そのセッションのすべてのDML文がパラレル実行の対象とみなされます。ただし、パラレルDMLが有効になっていても、パラレル・ヒントがない場合や表にパラレル属性がない場合、またはパラレル操作の制限に違反している場合、DML操作はシリアルで実行されます。
セッションのPARALLEL
DML
モードはSELECT
文、DDL文、およびDML文の問合せ部分の並列処理には影響しません。したがって、このモードが設定されていない場合、DML操作はパラレル化されませんが、DML文内のスキャン操作または結合操作はパラレル化されることがあります。
詳細は、「パラレルDMLの領域に関する考慮事項」および「パラレルDMLの制限」を参照してください。
UPDATE
、MERGE
およびDELETE
操作のパラレル・ディレクティブを指定するには次の2つの方法があります(PARALLEL
DML
モードが有効になっている場合)。
更新または削除される表(参照オブジェクト)の定義でパラレル句を使用します。
文で更新、マージまたは削除のパラレル・ヒントを使用します。
パラレル・ヒントは、UPDATE
、MERGE
およびDELETE
文で、UPDATE
、MERGE
またはDELETE
キーワードの直後に指定されます。変更対象の表の基礎となるスキャンにもヒントが適用されます。
ALTER
SESSION
FORCE
PARALLEL
DML
文を使用すると、セッションの後続のUPDATE
、MERGE
およびDELETE
文のパラレル句を上書きできます。UPDATE
、MERGE
およびDELETE
文のパラレル・ヒントは、ALTER
SESSION
FORCE
PARALLEL
DML
文よりも優先されます。
適用される可能性がある制限の詳細は、「並列度の制限」を参照してください。
次のルールにより、UPDATE
、MERGE
またはDELETE
操作をパラレルで実行するかどうかが決まります。
UPDATE
またはDELETE
操作がパラレル化されるのは、少なくとも次の1つに該当する場合のみです。
更新または削除される表にPARALLEL
が指定されている。
DML文にPARALLEL
ヒントが指定されている。
文に副問合せまたは更新可能ビューが含まれる場合、それらには独自のパラレル・ヒントまたはパラレル句が指定されていることがあります。ただし、このようなパラレル・ディレクティブはUPDATE
、MERGE
またはDELETE
操作をパラレル化する決定には影響しません。
表に対するパラレル・ヒントまたはパラレル句は、並列処理を決定するために、問合せおよびUPDATE
、MERGE
、DELETE
部分の両方で使用されます。UPDATE
、MERGE
またはDELETE
部分をパラレル化する決定は、問合せ部分とは独立して行われます。逆の場合も同様です。
DOPは問合せと同じルールによって決まります。UPDATE
およびDELETE
操作では、変更されるターゲット表のみ(参照オブジェクトのみ)が関係することに注意してください。したがって、UPDATE
またはDELETE
のパラレル・ヒント指定は、ターゲット表のパラレル宣言の指定よりも優先されます。つまり、優先順位は、MERGE
、UPDATE
、DELETE
ヒント、セッション、ターゲット表のパラレル宣言指定の順です。優先順位のルールは表8-2を参照してください。
DOPがパーティション数未満の場合、1つのパーティションの処理を最初に終了したプロセスが別のパーティションの処理を行うという方法により、すべてのパーティションの処理が終了するまで続けられます。DOPが操作に関係するパーティション数よりも多い場合、余分なパラレル実行サーバーは処理する作業がありません。
例8-4は、パラレルで実行できる更新操作を示します。tbl_1
がパーティション表で、表定義にパラレル句がある場合、c1
が100よりも大きいパーティションが表に複数あるとすると、表のスキャンがシリアルでも(索引スキャンなど)、更新操作はパラレル化されます。
例8-4 パラレル化: 例1
UPDATE tbl_1 SET c1=c1+1 WHERE c1>100;
例8-5は、PARALLEL
ヒントが指定された更新操作を示します。tbl_2
に対するスキャンと更新操作は両方とも並列度4でパラレルで実行されます。
INSERT
... SELECT
文では、INSERT
操作とSELECT
操作がDOPにかかわらず個別にパラレル化されます。
INSERT
... SELECT
文のINSERT
キーワードの後にパラレル・ヒントを指定できます。通常、問合せ先の表と挿入先の表は異なるため、このヒントによって、特に挿入操作のためのパラレル・ディレクティブを指定できます。
INSERT
... SELECT
文のパラレル・ディレクティブを指定するには次の方法があります(PARALLEL
DML
モードが有効になっている場合)。
文でのSELECT
パラレル・ヒントの指定
選択対象表の定義でのパラレル句の指定
文でのINSERT
パラレル・ヒントの指定
挿入対象表の定義でのパラレル句の指定
ALTER
SESSION
FORCE
PARALLEL
DML
文を使用すると、セッションの後続のINSERT
操作のパラレル句を上書きすることができます。挿入操作のパラレル・ヒントは、ALTER
SESSION
FORCE
PARALLEL
DML
文よりも優先されます。
次のルールにより、INSERT
... SELECT
文のINSERT
操作をパラレル化するかどうかが決まります。
INSERT
操作がパラレルで実行されるのは、少なくとも次の1つに該当する場合のみです。
DML文のINSERT
の後にPARALLEL
ヒントが指定されている。
挿入対象の表(参照オブジェクト)にPARALLEL
宣言が指定されている。
INSERT
操作のパラレル化の決定は、SELECT
操作とは別に行われます。逆の場合も同様です。
SELECT
またはINSERT
操作をパラレル化する決定が行われた後は、文全体のDOPを決めるために、INSERTヒント・ディレクティブ、セッション、挿入対象表のパラレル宣言指定、最大問合せディレクティブという優先順位のルールを使用して、1つのパラレル・ディレクティブが選択されます。
ここで、最大問合せディレクティブは、複数の表と索引のうちDOPが最大の表または索引によって問合せ操作の並列処理が決まることを意味します。
例8-6では、選択されたパラレル・ディレクティブがSELECT
操作とINSERT
操作の両方に適用されます。
DML操作をパラレルで実行するには、パラレル実行コーディネータがパラレル実行サーバーを取得し、パラレル実行サーバーがそれぞれのパラレル・プロセス・トランザクションで作業の一部を実行します。
次の条件に注意してください。
各パラレル実行サーバーは異なるパラレル・プロセス・トランザクションを生成します。
自動UNDO管理のかわりにロールバック・セグメントを使用する際は、同じロールバック・セグメントに存在するパラレル・プロセス・トランザクションの数を制限することによって、ロールバック・セグメントに対する競合を減らした方がよい場合があります。詳細は、『Oracle Database SQL言語リファレンス』を参照してください。
コーディネータにも独自のコーディネータ・トランザクションがあり、独自のロールバック・セグメントが対応しています。ユーザーレベルのトランザクション原子性を確保するには、コーディネータは2フェーズのコミット・プロトコルを使用して、パラレル・プロセス・トランザクションで実行される変更をコミットします。
パラレルDMLが有効になっているセッションでは、セッションのトランザクションが特殊なモードになる場合があります。トランザクションで任意のDML文が表をパラレルで変更した後、そのトランザクションでは同じ表に対してシリアル問合せ、パラレル問合せまたはDML文で再びアクセスすることはできません。パラレル変更の結果は、そのトランザクション内では確認できません。
同じトランザクション内でパラレルで変更された表に、シリアル文またはパラレル文でアクセスしようとすると、拒否され、エラー・メッセージが返されます。
パラレルDMLが有効になっているセッションでPL/SQLプロシージャまたはブロックが実行される場合、プロシージャまたはブロックの文にはこのルールが適用されます。
自動UNDO管理のかわりにロールバック・セグメントを使用する場合、パラレルDMLを使用するときにいくつかの制限があります。パラレルDMLおよびロールバック・セグメントの制限の詳細は、『Oracle Database SQL言語リファレンス』を参照してください。
パラレルDML操作をロールバックするために必要な時間は、フォワード操作の実行にかかる時間とほぼ同じです。
Oracle Databaseでは、トランザクションとプロセスが失敗した後、およびインスタンスとシステムで障害が発生した後のパラレル・ロールバックをサポートしています。Oracle Databaseでは、トランザクション・リカバリのロールフォワード・ステージとロールバック・ステージの両方をパラレル化できます。
パラレル・ロールバックの詳細は、『Oracle Databaseバックアップおよびリカバリ・ユーザーズ・ガイド』を参照してください。
文のエラーのためにトランザクションが失敗した際のユーザー発行のロールバックは、パラレル実行コーディネータとパラレル実行サーバーによってパラレルで実行されます。このロールバックには、フォワード・トランザクションとほぼ同じ時間がかかります。
パラレル実行コーディネータまたはパラレル実行サーバーの障害からのリカバリは、PMONプロセスによって実行されます。パラレル実行サーバーまたはパラレル実行コーディネータで障害が発生すると、PMONによってそのプロセスの作業がロールバックされ、トランザクションの他のすべてのプロセスによってその変更内容がロールバックされます。
パラレルUPDATE
ではオブジェクト内の既存の空き領域が使用されますが、ダイレクト・パスINSERT
ではデータのために新しいエクステントが取得されます。
パラレル実行では複数の同時子トランザクションがオブジェクトを変更するため、領域使用の特徴がシリアル実行と異なることがあります。
パラレルDML(ダイレクト・パスINSERT
を含む)には次の制限が適用されます。
UPDATE
、MERGE
およびDELETE
操作のイントラ・パーティション並列化を行うには、COMPATIBLE
初期化パラメータを9.2以上に設定する必要があります。
INSERT
VALUES
文はパラレルで実行されません。
1つのトランザクションには、様々な表を変更する複数のDML文が含まれる場合があります。ただし、パラレルDML文で1つの表が変更された後、後続のシリアル文またはパラレル文(DMLまたは問合せ)が、そのトランザクション内で同じ表に再度アクセスすることはできません。
シリアル・ダイレクト・パスINSERT
文の後にもこのような制限があります。同じトランザクションでは、変更された表に後続のSQL文(DMLまたは問合せ)がアクセスできません。
同じ表にアクセスする問合せが許可されるのは、パラレルDMLまたはダイレクト・パスINSERT
文の前であり、後には許可されません。
シリアル文またはパラレル文が、パラレルUPDATE
、DELETE
またはMERGE
、あるいはダイレクト・パスINSERT
によって同じトランザクションで変更された表にアクセスしようとすると拒否され、エラー・メッセージが返されます。
パラレルDMLは、自己参照型整合性、削除カスケードおよび遅延整合性の制約がある場合には実行されません。また、ダイレクト・パスINSERT
ではすべての参照整合性がサポートされません。
LOB
列を含む表に対してパラレルDMLを実行できますが、それは表がパーティション化されている場合です。ただし、イントラ・パーティション並列処理はサポートされません。
パラレルDML操作に関連するトランザクションは分散トランザクションであったり、分散トランザクションになることはできません。
クラスタ表はサポートされません。
パラレルのUPDATE
、DELETE
およびMERGE
操作は、一時表に対してはサポートされません。
これらの制限に違反すると文がシリアルで実行されます。警告またはエラー・メッセージは返されません(トランザクション内で同じ表にアクセスする文に関する制限を除きます。この場合はエラー・メッセージが生成されます)。
パーティション表のパーティション化キーを新しい値に更新できるのは、更新によってその行が新しいパーティションに移動されない場合のみです。表定義で行移動の句が有効になっている場合は更新が可能です。
ここでは、整合性制約とパラレルDML文の相互作用について説明します。
参照整合性の制限が発生するのは、ある表に対するDML操作が別の表に対して再帰的なDML操作を引き起こす可能性があるときです。整合性チェックを実行するために、変更対象のオブジェクトに行われるすべての変更を同時に確認する必要がある場合にも、この制限が適用されます。
表8-1に、参照整合性制約に関連する表に対して実行可能なすべての操作を示します。
影響する表に有効なトリガーが含まれており、DML文の結果によってトリガーが起動される可能性がある場合、そのDML操作はパラレルで実行されません。つまり、レプリケート中の表に対するDML文はパラレル化されません。
表に対するDMLをパラレル化するには関連するトリガーを無効にしておく必要があります。トリガーを有効または無効にすると、従属する共有カーソルが無効化されるので注意してください。
SQL文には、PL/SQLまたはJavaで作成したユーザー定義関数、あるいはC言語で作成した外部プロシージャとしてのユーザー定義関数を含めることができます。これらは、SELECT
リスト、SET
句またはWHERE
句に指定できます。SQL文がパラレル化されると、このような関数はパラレル実行サーバー・プロセスによって1行ずつ実行されます。関数で使用されるPL/SQLパッケージ変数またはJava静的属性は、完全に個々のパラレル実行プロセスのみで使用され、元のセッションからコピーされるのではなく各行が処理されるたびに新たに初期化されます。この処理のため、パラレルで実行した場合、すべての関数によって正しい結果が生成されるとはかぎりません。
ユーザーが作成した表関数を文のFROM
リストに指定できます。このような関数は、行出力を生成するためソース・テーブルのように機能します。表関数はその文で1回、各パラレル実行プロセスの開始時に初期化されます。すべての変数は、対応するパラレル実行プロセスでしか使用されません。
この項の内容は次のとおりです。
SELECT
文、あるいはDMLまたはDDL文の副問合せでは、次の場合にユーザー作成関数がパラレルで実行されることがあります。
PARALLEL_ENABLE
キーワードで宣言された場合。
パッケージまたはタイプで宣言され、PRAGMA
RESTRICT_REFERENCES
句にWNDS
、RNPS
およびWNPS
のすべてが指定された場合。
CREATE
FUNCTION
で宣言され、システムがPL/SQLコードの本体を分析して、コードがデータベースに書き込まず、パッケージ変数の読取りや変更も行わないことを判別できた場合。
関数の実行をシリアルで行うことが必要な場合でも、問合せまたは副問合せの他の部分はパラレルで実行されることがあります。
PRAGMA
RESTRICT_REFERENCES
句の詳細は『Oracle Databaseアドバンスト・アプリケーション開発者ガイド』、CREATE
FUNCTION
文の詳細は『Oracle Database SQL言語リファレンス』を参照してください。
パラレルDMLまたはDDL文においても、パラレル問合せと同じく、次の場合にユーザー作成関数がパラレルで実行されることがあります。
PARALLEL_ENABLE
キーワードで宣言された場合。
パッケージまたはタイプで宣言され、PRAGMA
RESTRICT_REFERENCES
句にRNDS
、WNDS
、RNPS
およびWNPS
のすべてが指定された場合。
CREATE
FUNCTION
文で宣言され、システムがPL/SQLコードの本体を分析して、コードがデータベースに読取りや書込みを行わず、パッケージ変数の読取りや変更も行わないことを判別できた場合。
パラレルDML文の場合、パラレルで実行できない関数コールが含まれていると、そのDML文全体がシリアルで実行されます。INSERT
... SELECT
文またはCREATE
TABLE
... AS
SELECT
文の場合は、ここで説明したパラレル問合せルールに従って、問合せ部分の関数コールはパラレル化されます。文のその他の部分をシリアルで実行する必要があっても、問合せはパラレル化できます。または、その逆の場合もあります。
パラレルSQL実行の他に、Oracle Databaseは次の操作について並列処理を使用できます。
パラレル・リカバリ
パラレル伝播(レプリケーション)
パラレル・ロード(外部表およびSQL*Loaderユーティリティ)
パラレルSQLと同じく、 パラレル・リカバリ、パラレル伝播およびパラレル外部表ロードは、パラレル実行コーディネータと複数のパラレル実行サーバーによって実行されます。ただし、SQL*Loaderを使用したパラレル・ロードでは異なるメカニズムが使用されます。
パラレル実行コーディネータとパラレル実行サーバーの動作は、実行する操作の種類(SQL、リカバリまたは伝播)に応じて変わることがあります。たとえば、プールのすべてのパラレル実行サーバーが占有されており、最大数のパラレル実行サーバーが起動されている場合は、次のようになります。
パラレルSQLおよび外部表ロードでは、パラレル実行コーディネータがシリアル処理に切り替えます。
パラレル伝播では、パラレル実行コーディネータがエラーを返します。
1つのセッションで、パラレル実行コーディネータは1種類の操作のみを調整します。たとえば、パラレル実行コーディネータは、パラレルSQLとパラレル・リカバリまたはパラレル伝播を同時に調整することはできません。
関連項目:
|
表8-2に、様々な種類のSQL文がパラレルで実行される方法と、並列処理の指定方法の優先順位を示します。
優先順位(1)の指定は、優先順位(2)および優先順位(3)よりも優先されます。
優先順位(2)の指定は、優先順位(3)よりも優先されます。
表8-2 パラレル化の優先順位: 句、ヒント、基礎となる表または索引の宣言
パラレル操作 | PARALLELヒント | PARALLEL句 | ALTER SESSION | パラレル宣言 |
---|---|---|---|---|
パラレル問合せの表スキャン(パーティション表または非パーティション表) |
(優先順位1) |
(優先順位2) |
(優先順位3)表のパラレル宣言 |
|
パラレル問合せの索引レンジ・スキャン(パーティション索引) |
(優先順位1) |
(優先順位2) |
(優先順位2)索引のパラレル宣言 |
|
パラレル |
(優先順位1) |
(優先順位3)更新または削除対象の表のパラレル宣言 |
||
パラレル |
(優先順位1)挿入の |
(優先順位3)挿入対象の表のパラレル宣言 |
||
|
|
|
|
|
|
(優先順位1) |
(優先順位2)選択対象の表のパラレル宣言 |
||
パラレル |
注意: |
(優先順位2) |
||
|
|
|
|
|
|
(優先順位1) |
(優先順位2)問合せ対象の表またはパーティション索引のパラレル宣言 |
||
パラレル |
(優先順位2) |
|||
パラレル |
(優先順位2) |
(優先順位1) |
||
|
||||
パーティションのパラレル |
(優先順位2) |
(優先順位1) |
||
パーティションのパラレル |
(優先順位2) |