ヘッダーをスキップ
Oracle® Database VLDBおよびパーティショニング・ガイド
11g リリース2 (11.2)
B56316-03
  ドキュメント・ライブラリへ移動
ライブラリ
製品リストへ移動
製品
目次へ移動
目次
索引へ移動
索引

前
 
次
 

並列処理の種類

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

パラレル問合せについて

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

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

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

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

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

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

Oracle Databaseでパラレルで実行できる問合せ操作の詳細は、「パラレル実行を使用できる操作」を参照してください。パラレル問合せがプロセスで実行される方法の詳細は、「SQL文のパラレル実行」を参照してください。リモート・オブジェクトを参照する問合せの例は、「分散トランザクションの制限」を参照してください。問合せをパラレルで実行するための条件とDOPを決定する要素の詳細は、「問合せのパラレル化のルール」を参照してください。

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

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

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

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

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

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

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

非パーティション索引構成表に対するパラレル問合せでは、パラレル高速全スキャンが使用されます。DOPが決定される要素は、優先順位の高い順に次のとおりです。

  1. PARALLELヒント(指定されている場合)

  2. ALTER SESSION FORCE PARALLEL QUERY

  3. 表に関連付けられている並列度(並列度がCREATE TABLEまたはALTER TABLE文に指定されている場合)

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

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

索引レンジ・スキャンと高速全スキャンの両方をパラレルで実行できます。パラレル高速全スキャンでは、パラレル化は非パーティション索引構成表の場合と同じです。パーティション索引構成表に対するパラレル索引レンジ・スキャンの場合、DOPは、前の優先順位リストから取得される並列度(パラレル高速全スキャンと同様)と索引構成表のパーティション数の小さい方の値です。DOPによって異なりますが、各パラレル実行サーバーは、1つ以上のパーティションを取得します。各パーティションは、主キー索引セグメントと関連するオーバーフロー・セグメント(ある場合)を含みます。

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

パラレル問合せを、オブジェクト型の表およびオブジェクト型の列を含む表に実行することができます。オブジェクト型に対するパラレル問合せでは、オブジェクト型に対する順次問合せで使用できるすべての機能がサポートされます。

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

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

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

  • オブジェクト・ビュー

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

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

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

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

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

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

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

ここでは、問合せをパラレルで実行するためのルールについて説明します。

パラレル化の決定

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

  • 問合せにパラレル・ヒントの指定(PARALLELまたはPARALLEL_INDEX)が含まれるか、問合せで参照されているスキーマ・オブジェクトにPARALLEL宣言が関連付けられている。

  • 問合せに指定された少なくとも1つの表で次のいずれかが必要である。

    • 全表スキャン

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

  • スカラー副問合せがSELECTリストにない。

並列度

問合せのDOPは次のルールによって決まります。

  • 問合せは、問合せに関連する表宣言のすべて、および問合せの回答を得られる可能性のある索引すべて(参照オブジェクト)の中で最大のDOPを使用します。つまり、最大のDOPが設定された表または索引によって、問合せのDOPの最大問合せディレクティブが決まります。

  • 表に関して、問合せでのパラレル・ヒント指定と表指定でのパラレル宣言の両方がある場合、ヒント指定がパラレル宣言指定よりも優先されます。優先順位のルールは表8-2を参照してください。

パラレルDDL文について

ここでは、DDL文の並列処理に関する次の項目について説明します。

パラレル化できる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列を含む非パーティション表では実行できません。

パラレルでのCREATE TABLE ... AS SELECT

パラレル実行により、問合せと表作成操作(別の表または一連の表に対する副問合せを使用した表の作成)をパラレルで実行できます。これは、サマリー表またはロールアップ表を作成する場合に大変便利です。

クラスタ表の作成と移入をパラレルで行うことはできません。

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

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

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

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

パラレルDDLは、サマリー表の作成や、スタンドアロン・トランザクションである大量データ・ロードの実行(必ずしもリカバリ可能でなくてもよい)によく使用されます。Oracle DatabaseロギングをオフにするとUNDOログまたはREDOログは生成されないため、パラレルDML操作のパフォーマンスは多くの場合向上しますがオールオアナッシング操作になります。つまり、操作がなんらかの理由で失敗した場合、操作を完全にやりなおす必要があります。再開することはできません。

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

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

パラレルDDLの領域管理

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

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

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

空き領域とパラレルDDL

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

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

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

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

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

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

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

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

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

DDL文のルール

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 | REBUILD] INDEXまたは[MOVE | SPLIT] PARTITIONのルール

索引の作成と変更のルールについて次の項目で説明します。

パラレルCREATE INDEXまたはALTER INDEX ... REBUILD

CREATE INDEX文とALTER INDEX ... REBUILD文は、PARALLEL句またはALTER SESSION FORCE PARALLEL DDL文によってのみパラレル化できます。

ALTER INDEX ... REBUILD文をパラレル化できるのは非パーティション索引の場合のみですが、ALTER INDEX ... REBUILD PARTITIONPARALLEL句またはALTER SESSION FORCE PARALLEL DDL文を使用してパラレル化できます。

ALTER INDEX ... REBUILD(非パーティション化)、ALTER INDEX ... REBUILD PARTITIONおよびCREATE INDEXのスキャン操作は、REBUILD操作またはCREATE操作と同じ並列処理になり、同じDOPを使用します。DOPがREBUILDまたはCREATEに指定されない場合、デフォルトはCPUの数です。

パラレルMOVE PARTITIONまたはSPLIT PARTITION

ALTER INDEX ... MOVE PARTITIONALTER INDEX ...SPLIT PARTITION文は、PARALLEL句またはALTER SESSION FORCE PARALLEL DDL文によってのみパラレル化できます。これらの文のスキャン操作は、対応するMOVE操作またはSPLIT操作と同じ並列処理になります。DOPが指定されない場合、デフォルトはCPUの数です。


注意:

PARALLEL_DEGREE_POLICYAUTOに設定されている場合、文レベルの並列処理は無視されます。

CREATE TABLE AS SELECTのルール

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部分)

CREATE TABLE ... AS SELECTCREATE操作は、PARALLEL句またはALTER SESSION FORCE PARALLEL DDL文によってのみパラレル化できます。

CREATE TABLE ... AS SELECTCREATE操作がパラレル化されるとき、可能であればスキャン操作もパラレル化されます。スキャン操作をパラレル化できないのは次のような場合です。

  • SELECT句にNO_PARALLELヒントがある場合。

  • 操作によって非パーティション表の索引がスキャンされる場合。

CREATE操作がパラレル化されないとき、SELECTをパラレル化できるのは、PARALLELヒントがある場合、または選択される表(またはパーティション索引)にパラレル宣言がある場合です。

並列度(CREATE部分)

CREATE操作およびSELECT操作(パラレル化される場合)のDOPは、ALTER SESSION FORCE PARALLEL DDL文によって上書きされないかぎり、CREATE文のPARALLEL句によって指定されます。PARALLEL句でDOPが指定されない場合、デフォルトはCPUの数です。

パラレルDML操作について

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


注意:

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

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

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

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

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

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

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

データ・ウェアハウス・システムでは、大容量の表を本番システムの新規データまたは変更データで定期的にリフレッシュ(更新)する必要があります。MERGE文を使用すると、これを効率よく実行できます。

中間サマリー表の作成

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

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

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

多くのDSSアプリケーションは、一連の基準に基づいて定期的に顧客をスコアリングしています。通常、スコアは大容量のDSS表に格納されます。その後、スコア情報は意思決定(たとえばメーリング・リストへの指定)で使用されます。

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

履歴表の更新

履歴表は、最新の時間間隔における企業のビジネス・トランザクションを示します。DBAは定期的に、この表から最も古い行セットを削除し、新しい行セットを挿入します。パラレルINSERT ... SELECTおよびパラレルDELETE操作を使用すると、このロールオーバー・タスクが高速化されます。

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

バッチ・ジョブの実行

業務時間外にOLTPデータベースで実行されるバッチ・ジョブは、ジョブを完了する必要のある時間枠が決まっています。時間どおりに確実にジョブを完了するための最適な手段が、パラレルでの操作の実行です。ワーク・ロードが増えると、コンピュータ・リソースを追加できます。パラレル操作のスケールアップ・プロパティにより時間制限を守ることができます。

パラレルDMLの有効化

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のルール

UPDATEMERGEおよびDELETE操作のパラレル・ディレクティブを指定するには次の2つの方法があります(PARALLEL DMLモードが有効になっている場合)。

  • 更新または削除される表(参照オブジェクト)の定義でパラレル句を使用します。

  • 文で更新、マージまたは削除のパラレル・ヒントを使用します。

パラレル・ヒントは、UPDATEMERGEおよびDELETE文で、UPDATEMERGEまたはDELETEキーワードの直後に指定されます。変更対象の表の基礎となるスキャンにもヒントが適用されます。

ALTER SESSION FORCE PARALLEL DML文を使用すると、セッションの後続のUPDATEMERGEおよびDELETE文のパラレル句を上書きできます。UPDATEMERGEおよびDELETE文のパラレル・ヒントは、ALTER SESSION FORCE PARALLEL DML文よりも優先されます。

適用される可能性がある制限の詳細は、「並列度の制限」を参照してください。

パラレル化の決定

次のルールにより、UPDATEMERGEまたはDELETE操作をパラレルで実行するかどうかが決まります。

UPDATEまたはDELETE操作がパラレル化されるのは、少なくとも次の1つに該当する場合のみです。

  • 更新または削除される表にPARALLELが指定されている。

  • DML文にPARALLELヒントが指定されている。

  • ALTER SESSION FORCE PARALLEL DML文がセッション内で前に発行されている。

文に副問合せまたは更新可能ビューが含まれる場合、それらには独自のパラレル・ヒントまたはパラレル句が指定されていることがあります。ただし、このようなパラレル・ディレクティブはUPDATEMERGEまたはDELETE操作をパラレル化する決定には影響しません。

表に対するパラレル・ヒントまたはパラレル句は、並列処理を決定するために、問合せおよびUPDATEMERGEDELETE部分の両方で使用されます。UPDATEMERGEまたはDELETE部分をパラレル化する決定は、問合せ部分とは独立して行われます。逆の場合も同様です。

並列度

DOPは問合せと同じルールによって決まります。UPDATEおよびDELETE操作では、変更されるターゲット表のみ(参照オブジェクトのみ)が関係することに注意してください。したがって、UPDATEまたはDELETEのパラレル・ヒント指定は、ターゲット表のパラレル宣言の指定よりも優先されます。つまり、優先順位は、MERGEUPDATEDELETEヒント、セッション、ターゲット表のパラレル宣言指定の順です。優先順位のルールは表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でパラレルで実行されます。

例8-5 パラレル化: 例2

UPDATE /*+ PARALLEL(tbl_2,4) */ tbl_2 SET c1=c1+1;

INSERT ... SELECTのルール

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宣言が指定されている。

  • ALTER SESSION FORCE PARALLEL DML文がセッション内で前に発行されている。

INSERT操作のパラレル化の決定は、SELECT操作とは別に行われます。逆の場合も同様です。

並列度

SELECTまたはINSERT操作をパラレル化する決定が行われた後は、文全体のDOPを決めるために、INSERTヒント・ディレクティブ、セッション、挿入対象表のパラレル宣言指定、最大問合せディレクティブという優先順位のルールを使用して、1つのパラレル・ディレクティブが選択されます。

ここで、最大問合せディレクティブは、複数の表と索引のうちDOPが最大の表または索引によって問合せ操作の並列処理が決まることを意味します。

例8-6では、選択されたパラレル・ディレクティブがSELECT操作とINSERT操作の両方に適用されます。

例8-6 パラレル化: 例3

使用されるDOPは、INSERTヒントに指定された2です。

INSERT /*+ PARALLEL(tbl_ins,2) */ INTO tbl_ins
SELECT /*+ PARALLEL(tbl_sel,4) */ * FROM tbl_sel;

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

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

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

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

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

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

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

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

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

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

自動UNDO管理のかわりにロールバック・セグメントを使用する場合、パラレルDMLを使用するときにいくつかの制限があります。パラレルDMLおよびロールバック・セグメントの制限の詳細は、『Oracle Database SQL言語リファレンス』を参照してください。

パラレルDMLのリカバリ

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

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

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

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

文のエラーのためにトランザクションが失敗した際のユーザー発行のロールバックは、パラレル実行コーディネータとパラレル実行サーバーによってパラレルで実行されます。このロールバックには、フォワード・トランザクションとほぼ同じ時間がかかります。

プロセス・リカバリ

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

システム・リカバリ

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

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

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

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

パラレルDMLの制限

パラレル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を実行できますが、それは表がパーティション化されている場合です。ただし、イントラ・パーティション並列処理はサポートされません。

  • パラレルDML操作に関連するトランザクションは分散トランザクションであったり、分散トランザクションになることはできません。

  • クラスタ表はサポートされません。

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

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

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

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

関数の制限

パラレルDMLの関数の制限は、パラレルDDLおよびパラレル問合せの関数の制限と同じです。詳細は、「関数のパラレル実行について」を参照してください。

データ整合性の制限

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

NOT NULLおよびCHECK

これらの整合性制約は使用できます。列レベルおよび行レベルそれぞれで施行されるため、パラレルDMLでは問題になりません。

UNIQUEおよびPRIMARY KEY

これらの整合性制約は使用できます。

FOREIGN KEY(参照整合性)

参照整合性の制限が発生するのは、ある表に対するDML操作が別の表に対して再帰的なDML操作を引き起こす可能性があるときです。整合性チェックを実行するために、変更対象のオブジェクトに行われるすべての変更を同時に確認する必要がある場合にも、この制限が適用されます。

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

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

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

INSERT

(該当なし)

パラレル化なし

パラレル化なし

MERGE

(該当なし)

パラレル化なし

パラレル化なし

UPDATE No Action

サポート対象

サポート対象

パラレル化なし

DELETE No Action

サポート対象

サポート対象

パラレル化なし

DELETE Cascade

パラレル化なし

(該当なし)

パラレル化なし


削除カスケード

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

自己参照型整合性

自己参照型整合性制約のある表に対するDMLは、参照されるキー(主キー)に関係する場合はパラレル化されません。その他すべての列に対するDMLでは並列処理が可能です。

遅延可能整合性制約

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

トリガーの制限

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

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

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

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

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

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

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

例8-7 分散トランザクション並列処理

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

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

例8-8 分散トランザクション並列処理

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

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

例8-9 分散トランザクション並列処理

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

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

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

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

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

パラレル問合せでの関数

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

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

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

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

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

PRAGMA RESTRICT_REFERENCES句の詳細は『Oracle Databaseアドバンスト・アプリケーション開発者ガイド』CREATE FUNCTION文の詳細は『Oracle Database SQL言語リファレンス』を参照してください。

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

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

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

  • パッケージまたはタイプで宣言され、PRAGMA RESTRICT_REFERENCES句にRNDSWNDSRNPSおよび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とパラレル・リカバリまたはパラレル伝播を同時に調整することはできません。


関連項目:

  • パラレル・ロードおよびSQL*Loaderの詳細は、『Oracle Databaseユーティリティ』を参照してください。

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

  • パラレル・インスタンス・リカバリの詳細は、『Oracle Databaseパフォーマンス・チューニング・ガイド』を参照してください。

  • パラレル伝播の詳細は、『Oracle Databaseアドバンスト・レプリケーション』を参照してください。


パラレル化ルールのまとめ

表8-2に、様々な種類のSQL文がパラレルで実行される方法と、並列処理の指定方法の優先順位を示します。

  • 優先順位(1)の指定は、優先順位(2)および優先順位(3)よりも優先されます。

  • 優先順位(2)の指定は、優先順位(3)よりも優先されます。

表8-2 パラレル化の優先順位: 句、ヒント、基礎となる表または索引の宣言

パラレル操作 PARALLELヒント PARALLEL句 ALTER SESSION パラレル宣言

パラレル問合せの表スキャン(パーティション表または非パーティション表)

(優先順位1) PARALLEL


(優先順位2) FORCE PARALLEL QUERY

(優先順位3)表のパラレル宣言

パラレル問合せの索引レンジ・スキャン(パーティション索引)

(優先順位1) PARALLEL_INDEX


(優先順位2) FORCE PARALLEL QUERY

(優先順位2)索引のパラレル宣言

パラレルUPDATEまたはDELETE(パーティション表のみ)

(優先順位1) PARALLEL


(優先順位2) FORCE PARALLEL DML

(優先順位3)更新または削除対象の表のパラレル宣言

パラレルINSERT... SELECTINSERT操作(パーティション表または非パーティション表)

(優先順位1)挿入のPARALLEL


(優先順位2) FORCE PARALLEL DML

(優先順位3)挿入対象の表のパラレル宣言

INSERTがパラレルの場合の、INSERT ... SELECTSELECT操作

INSERT文の並列度を使用

INSERT文の並列度を使用

INSERT文の並列度を使用

INSERT文の並列度を使用

INSERTがシリアルの場合の、INSERT ... SELECTSELECT操作

(優先順位1) PARALLEL



(優先順位2)選択対象の表のパラレル宣言

パラレルCREATE TABLE ... AS SELECTCREATE操作(パーティション表または非パーティション表)

注意: SELECT句のヒントはCREATE操作には影響しません。

(優先順位2)

(優先順位1) FORCE PARALLEL DDL


CREATEがパラレルの場合の、CREATE TABLE ... AS SELECTSELECT操作

CREATE文の並列度を使用

CREATE文の並列度を使用

CREATE文の並列度を使用

CREATE文の並列度を使用

CREATEがシリアルの場合の、CREATE TABLE ... AS SELECTSELECT操作

(優先順位1) PARALLEL or PARALLEL_INDEX



(優先順位2)問合せ対象の表またはパーティション索引のパラレル宣言

パラレルCREATE INDEX(パーティション索引または非パーティション索引)


(優先順位2)

(優先順位1) FORCE PARALLEL DDL


パラレルREBUILD INDEX(非パーティション索引)


(優先順位2)

(優先順位1) FORCE PARALLEL DDL


REBUILD INDEX(パーティション索引): パラレル化なし





パーティションのパラレルREBUILD INDEX


(優先順位2)

(優先順位1) FORCE PARALLEL DDL


パーティションのパラレルMOVEまたはSPLIT


(優先順位2)

(優先順位1) FORCE PARALLEL DDL