8.5 並列処理の種類
並列処理には複数のタイプがあります。
ここでは、次の項目で並行処理の種類について説明します。
8.5.1 パラレル問合せについて
SELECT
文でパラレル問合せとパラレル副問合せを使用できます。DDL文とDML文(INSERT
、UPDATE
およびDELETE
)の問合せ部分もパラレルで実行できます。
また、外部表をパラレルで問い合せることもできます。
SQL問合せのパラレル化決定には、パラレル化の決定と並列度(DOP)という2つの要素があります。これらの要素の決定方法は、問合せ、DDL操作およびDML操作で異なります。DOPを決定するときに、Oracle Databaseは次の参照オブジェクトを調べます。
-
パラレル問合せは、パラレルで実行される問合せの部分で、それぞれの表および索引を調べて、どれが参照表かを決定します。原則として、最大のDOPが設定された表または索引を選択します。
-
パラレルDML(
INSERT
、UPDATE
、MERGE
およびDELETE
)では、DOPを決定する参照オブジェクトは、挿入、更新または削除操作によって変更される表です。パラレルDMLではデッドロックを防ぐためにDOPに制限が課せられます。パラレルDML文に副問合せが含まれる場合、副問合せのDOPはDML操作のDOPと同じになります。 -
パラレルDDLでは、DOPを決定する参照オブジェクトは、作成、再構築、分割または移動される表、索引またはパーティションです。パラレルDDL文に副問合せが含まれる場合、副問合せのDOPはDDL操作と同じになります。
この項では、次の項目について説明します。
関連項目:
-
パラレル問合せの実行方法の詳細は、「SQL文のパラレル実行」を参照してください
-
リモート・オブジェクトを参照する問合せの例は、「分散トランザクションの制限」を参照してください
-
問合せをパラレルで実行するための条件とDOPを決定する要素の詳細は、「問合せのパラレル化のルール」を参照してください
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
BY
、GROUP
BY
または集合操作による)を含む問合せをパラレルで実行するにはMAP
関数が必要です。MAP
関数がない場合、問合せは自動的にシリアルで実行されます。 -
パラレルDMLおよびパラレルDDLはオブジェクト型に対してはサポートされず、そのような文は常にシリアルで実行されます。
これらいずれかの制限のために問合せをパラレルで実行できない場合は、常に問合せ全体がシリアルで実行されエラー・メッセージは返されません。
8.5.1.5 問合せのパラレル化のルール
SQL問合せは、特定の条件下でのみパラレルで実行できます。
SELECT
文をパラレルで実行できるのは、次の条件のいずれかが満たされている場合のみです。
-
問合せに、文レベルまたはオブジェクト・レベルのパラレル・ヒント仕様(
PARALLEL
またはPARALLEL_INDEX
)が含まれている。 -
問合せ内で参照されるスキーマ・オブジェクトに、
PARALLEL
宣言が関連付けられている。 -
自動並列度(自動DOP)が有効になっている。
-
ALTER
SESSION
FORCE
PARALLEL
QUERY
文を使用してパラレル問合せが強制されている。
また、実行計画には、少なくとも次のいずれかが必要となります。
-
全表スキャン
-
複数パーティションに及ぶ索引レンジ・スキャン
-
索引高速全体スキャン
-
パラレル表関数
関連項目:
-
自動DOPの詳細は、「自動並列度」を参照してください
-
並列度(DOP)を決定するルールの詳細は、「SQL文の並列度ルール」を参照してください
-
ALTER
SESSION
SQL文の詳細は、『Oracle Database SQL言語リファレンス』を参照してください
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.5.2.3 リカバリ可能性とパラレルDDL
パラレルDDLは、サマリー表の作成や、スタンドアロン・トランザクションである大量データ・ロードの実行(必ずしもリカバリ可能でなくてもよい)によく使用されます。
Oracle DatabaseロギングをオフにするとUNDOログまたはREDOログは生成されないため、パラレルDML操作のパフォーマンスは多くの場合向上しますがオールオアナッシング操作になります。つまり、操作がなんらかの理由で失敗した場合、操作をやりなおす必要があります。再開することはできません。
パラレル表作成(またはその他のパラレルDDL操作)時にロギングを無効化する場合は、メディア障害による表の損失を防ぐために、表が作成されてからその表を含む表領域をバックアップする必要があります。
UNDOログおよびREDOログの生成を無効にするには、CREATE
TABLE
、CREATE
INDEX
、ALTER
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に示すように内部断片化が発生することがあります。データファイルの内部表エクステント内の空き領域を他の空き領域と結合して、エクステントとして割り当てることはできません。
関連項目:
パラレルでの表および索引作成の詳細は、『Oracle Database SQLチューニング・ガイド』を参照してください
8.5.2.7 DDL文のルール
DDL操作は、特定の条件下でパラレルで実行できます。
DDL操作をパラレルで実行できるのは、次の条件のうち少なくとも1つが満たされている場合のみです。
-
構文で
PARALLEL
句(宣言)が指定されている。CREATE
TABLE
、CREATE
INDEX
、ALTER
INDEX
REBUILD
およびALTER
INDEX
REBUILD
PARTITION
の場合、パラレル宣言はデータ・ディクショナリに格納されます。 -
自動並列度(自動DOP)が有効になっている。
-
ALTER
SESSION
FORCE
PARALLEL
DDL
文を使用してパラレルDDLが強制されている。
関連項目:
-
自動DOPの詳細は、「自動並列度」を参照してください
-
並列度(DOP)を決定するルールの詳細は、「SQL文の並列度ルール」を参照してください
-
ALTER
SESSION
SQL文の詳細は、『Oracle Database SQL言語リファレンス』を参照してください
8.5.2.8 CREATE TABLE AS SELECTのルール
CREATE
TABLE
AS
SELECT
文のCREATE
操作は、パラレル化DDL文のルールに基づいてパラレル化されます。
また、文のSELECT
部分で指定されている文レベルPARALLEL
ヒントでも、DDL操作をパラレル化できます。パラレル化DDL文のルールの詳細は、DDL文のルールを参照してください。
CREATE
TABLE
AS
SELECT
のCREATE
操作がパラレル化されるとき、可能であればスキャン操作もパラレル化されます。
DDL部分がパラレル化されない場合でも、問合せのパラレル化のルールに基づいて、SELECT
部分をパラレル化できます。
自動並列度(自動DOP)では、文のDDL部分と問合せ部分の両方がパラレル化されます。
並列度(DOP)を決定するためのルールの詳細は、SQL文の並列度ルールを参照してください。
8.5.3 パラレルDML操作について
このトピックでは、パラレルDML操作について説明します。
パラレルDML(PARALLEL
INSERT
、UPDATE
、DELETE
およびMERGE
)は、パラレル実行メカニズムを使用して、大規模なデータベース表や索引に対する大規模なDML操作を高速化または拡張します。
ノート:
通常、DMLには問合せが含まれますが、この章ではDMLという語はINSERT
、UPDATE
、MERGE
および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.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のルール
更新、マージまたは削除操作は、特定の条件下でのみパラレル化されます。
UPDATE
、MERGE
およびDELETE
操作は、次の条件のうち少なくとも1つが満たされている場合のみパラレル化されます。
-
前の
CREATE
TABLE
またはALTER
TABLE
文によって、更新、マージまたは削除の対象となる表にPARALLEL
宣言が設定されている。 -
DML文で文レベルまたはオブジェクト・レベルの
PARALLEL
ヒントが指定されている。 -
自動並列度(自動DOP)が有効になっている。
-
ALTER
SESSION
FORCE
PARALLEL
DML
文を使用してパラレルDMLが強制されている。
文に副問合せまたは更新可能なビューが含まれている場合は、問合せのパラレル化のルールに基づいて、それらもパラレルで実行される可能性があります。UPDATE
、MERGE
およびDELETE
部分のパラレル化の決定は、問合せ部分から独立しており、逆もまた同様です。文レベルのPARALLEL
ヒントまたは自動DOPでは、DML部分と問合せ部分の両方がパラレル化されます。
関連項目:
-
自動DOPの詳細は、「自動並列度」を参照してください
-
更新、マージまたは削除操作について可能性のある制限の詳細は、「並列度の制限」を参照してください
-
並列度(DOP)を決定するルールの詳細は、「SQL文の並列度ルール」を参照してください
-
ALTER
SESSION
SQL文の詳細は、『Oracle Database SQL言語リファレンス』を参照してください
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
操作の両方がパラレル化されます。
関連項目:
-
自動DOPの詳細は、「自動並列度」を参照してください
-
並列度(DOP)を決定するルールの詳細は、「SQL文の並列度ルール」を参照してください
-
ALTER
SESSION
SQL文の詳細は、『Oracle Database SQL言語リファレンス』を参照してください
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.8 パラレルDMLの領域に関する考慮事項
パラレルUPDATE
ではオブジェクト内の既存の空き領域が使用されますが、ダイレクト・パスINSERT
ではデータのために新しいエクステントが取得されます。
パラレル実行では複数の同時子トランザクションがオブジェクトを変更するため、領域使用の特徴がシリアル実行と異なることがあります。
8.5.3.9 パラレルDMLの制限
パラレルDMに適用されるいくつかの制限事項があります。
パラレル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操作は、トリガーを含む表に対しては実行できません。
-
レプリケーション機能はパラレルDMLに対してはサポートされません。
-
パラレルDMLは、自己参照型整合性、削除カスケードおよび遅延整合性の制約がある場合には実行されません。また、ダイレクト・パス
INSERT
ではすべての参照整合性がサポートされません。 -
オブジェクト列を含む表に対してパラレルDMLを実行できますが、それはオブジェクト列にアクセスしない場合です。
-
LOB
列を含む表に対してパラレルDMLを実行できますが、それは表がパーティション化されている場合です。ただし、イントラ・パーティション並列処理はサポートされません。LOB列を含む非パーティション化表では、LOB列がSecureFiles LOBとして宣言される場合に、パラレルの
INSERT
操作がサポートされます。パラレルのUPDATE
、DELETE
およびMERGE
操作は、そのような表に対してはサポートされません。 -
DML操作が分散トランザクションに含まれる場合、またはDMLまたは問合せ操作の対象がリモート・オブジェクトである場合、そのDML操作はパラレルで実行できません。
-
クラスタ化表がサポートされていません。
-
パラレルの
UPDATE
、DELETE
およびMERGE
操作は、一時表に対してはサポートされません。 -
表がパーティション化されていない場合、パラレルDMLは、ビットマップ索引を使用した表でサポートされません。
これらの制限に違反すると文がシリアルで実行されます。警告またはエラー・メッセージは返されません(トランザクション内で同じ表にアクセスする文に関する制限を除きます。この場合はエラー・メッセージが生成されます)。
8.5.3.9.1 パーティション化キーの制限
パーティション表のパーティション化キーを新しい値に更新できるのは、更新によってその行が新しいパーティションに移動されない場合のみです。
表定義で行移動の句が有効になっている場合は更新が可能です。
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文 | 親での発行 | 子での発行 | 自己参照型 |
---|---|---|---|
|
(該当せず) |
パラレル化なし |
パラレル化なし |
|
(該当せず) |
パラレル化なし |
パラレル化なし |
|
サポートされている |
サポートされている |
パラレル化なし |
|
サポートされている |
サポートされている |
パラレル化なし |
|
パラレル化なし |
(該当せず) |
パラレル化なし |
8.5.3.10.4 削除カスケード
このトピックでは、削除カスケード・データ整合性制限について説明します。
外部キーを含む表に対する削除カスケードを使用した削除はパラレル化されません。パラレル実行サーバーが、複数のパーティション(親表および子表)から行を削除しようとするためです。
8.5.3.10.5 自己参照型整合性
自己参照型整合性制約のある表に対するDMLは、参照されるキー(主キー)に関係する場合はパラレル化されません。
その他すべての列に対する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の同時実行
UNION
やUNION
ALL
などの集合演算子は、単一のSQL文に結合される複数の問合せ(分岐)で構成されます。
従来、集合演算子は順に処理されます。個々の分岐をシリアルまたはパラレルで処理できますが、一度に1つの分岐のみで順に処理されます。この方法は多くのユースケースを満たしますが、UNION
またはUNION
ALL
文の複数の分岐の処理を同時に実行する状況があります。ほとんどの一般的な状況は、複数またはすべての分岐がリモートのSQL文である場合です。この状況では、すべての参加するリモート・システムの同時処理は、参加するシステムのワークロードを増やさずに処理時間全体の処理速度を上げるよう求められます。
UNION
またはUNION
ALL
文の同時実行のデフォルト動作は、OPTIMIZER_FEATURES_ENABLE
初期化パラメータの設定によって制御されます。12.1
に設定すると、同時実行がデフォルトで有効になります。少なくとも1つの分岐の文がローカルでパラレルの処理が考慮される文は、UNION
またはUNION
ALL
文全体も同時に処理されます。システムは個々のローカル分岐の文のDOPを計算し、UNION
またはUNION
ALL
文全体の実行のDOPの最大値を選択します。次に、システムは、パラレルで処理される分岐のパラレル化およびシリアルおよびリモート文の同時ワーカーに選択されたDOPを使用して、できるだけ多くの分岐を同時に処理します。
OPTIMIZER_FEATURES_ENABLE
初期化パラメータが12.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
句にWNDS
、RNPS
およびWNPS
のすべてが指定された場合。 -
CREATE
FUNCTION
で宣言され、システムがPL/SQLコードの本体を分析して、コードがデータベースに書き込まず、パッケージ変数の読取りや変更も行わないことを判別できた場合。
関数の実行をシリアルで行うことが必要な場合でも、問合せまたは副問合せの他の部分はパラレルで実行されることがあります。
関連項目:
-
PRAGMA
RESTRICT_REFERENCES
句の詳細は、『Oracle Database開発ガイド』を参照してください -
CREATE
FUNCTION
文の詳細は、『Oracle Database SQL言語リファレンス』を参照してください
8.5.4.2 パラレルDMLおよびDDL文での関数
ユーザー関数は、特定の条件下でDMLまたはDDL文で実行できます。
パラレルDMLまたはDDL文においても、パラレル問合せと同じく、次の場合にユーザー作成関数がパラレルで実行されることがあります。
-
PARALLEL_ENABLE
キーワードで宣言された場合。 -
パッケージまたはタイプで宣言され、
PRAGMA
RESTRICT_REFERENCES
句にRNDS
、WNDS
、RNPS
および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とパラレル・リカバリまたはパラレル伝播を同時に調整することはできません。
関連項目:
-
パラレル・ロードおよびSQL*Loaderの詳細は、『Oracle Databaseユーティリティ』を参照してください
-
パラレル・メディア・リカバリの詳細は、『Oracle Databaseバックアップおよびリカバリ・ユーザーズ・ガイド』を参照してください
-
パラレル・インスタンス・リカバリの詳細は、『Oracle Databaseパフォーマンス・チューニング・ガイド』を参照してください
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) |
優先度(4) |
優先度(5) |
パラレル |
優先度(1) |
優先度(2) |
該当なし |
優先度(3) |
優先度(4) |
優先度(5)のターゲット表 |
パラレル |
優先度(1) |
優先度(2) |
該当なし |
優先度(3) |
優先度(4) |
挿入対象となる優先度(5)の表 |
|
優先度(1) |
優先度(2) |
該当なし |
優先度(3) |
優先度(4) |
選択対象となる優先度(5)の表 |
パラレル |
優先度(1) |
該当なし |
優先度(4) |
優先度(2) |
優先度(3) |
該当なし |
|
優先度(1) |
優先度(2) |
該当なし |
優先度(3) |
優先度(4) |
優先度(5) |
その他のDDL操作。詳細は、DDL文のルールを参照してください。 |
該当なし |
該当なし |
優先度(3) |
優先度(1) |
優先度(2) |
該当なし |
関連項目:
-
PARALLEL
ヒントの詳細は、『Oracle Database SQL言語リファレンス』を参照してください。 -
PARALLEL
句の詳細は、『Oracle Database SQL言語リファレンス』を参照してください -
ALTER
SESSION
SQL文の詳細は、『Oracle Database SQL言語リファレンス』を参照してください