8.6 パラレル実行のためのパラメータの初期化とチューニングについて

パラメータを使用して、パラレル実行を初期設定およびチューニングできます。

Oracle Databaseでは、データベース起動時のCPU_COUNTPARALLEL_THREADS_PER_CPUの値に基づいて、パラレル実行パラメータのデフォルトを計算します。パラメータを手動でチューニングして、特定のシステム構成またはパフォーマンス目標に合うように値を増減することもできます。たとえば、パラレル実行がまったく使用されないシステムではPARALLEL_MAX_SERVERSを0に設定できます。

パラレル実行パラメータを手動でチューニングすることもできます。パラレル実行はデフォルトで有効になっています。

パラレル実行の初期設定およびチューニングについては、次のトピックで説明します。

8.6.1 デフォルトのパラメータ設定

Oracle Databaseでは、パラレル実行パラメータがデフォルトで自動設定されます。

パラレル実行のパラメータを表8-3に示します。

表8-3パラメータとデフォルト値

パラメータ デフォルト コメント

PARALLEL_ADAPTIVE_MULTI_USER

FALSE

パラレル実行によりSQLの並列度(DOP)リクエストの数を制限し、システムのオーバーロードを回避します。

PARALLEL_ADAPTIVE_MULTI_USERは、Oracle Database 12cリリース2 (12.2.0.1)で非推奨となり、将来のリリースではサポートされなくなります。かわりに、パラレル文のキューイングを使用することをお薦めします。

PARALLEL_DEGREE_LIMIT

CPU

自動DOPが使用された場合に、文に許可されるDOPの最大値を制御します。最大DOPは、次のとおりです。

SUM(CPU_COUNT)*PARALLEL_THREADS_PER_CPU

PARALLEL_DEGREE_LIMITの値AUTOには、値CPUと同じ機能があります。

PARALLEL_DEGREE_POLICY

MANUAL

自動DOP、パラレル文のキューイングおよびインメモリー・パラレル実行を使用するかどうかを制御します。デフォルトでは、これらの機能はすべて無効化されています。

PARALLEL_EXECUTION_MESSAGE_SIZE

16 KB

パラレル実行サーバー、およびパラレル実行サーバーと問合せコーディネータの通信に使用されるバッファのサイズを指定します。これらのバッファは、共有プールの中から割り当てられます。

PARALLEL_FORCE_LOCAL

FALSE

パラレル実行を現在のOracle RACインスタンスに制限します。

PARALLEL_MAX_SERVERS

「PARALLEL_MAX_SERVERS」を参照してください。

1インスタンスに対するパラレル実行プロセスとパラレル・リカバリ・プロセスの最大数が指定されます。需要が増加するにつれて、インスタンスの起動時に作成された数からこの値までプロセス数が増加します。

このパラメータの設定が低すぎると、問合せが処理中に十分なパラレル実行プロセスを得られない場合があります。設定が高すぎると、ピーク時にメモリー・リソース不足が発生してパフォーマンスが低下する可能性があります。

PARALLEL_MIN_SERVERS

CPU_COUNT * PARALLEL_THREADS_PER_CPU * 2

Oracle Databaseの起動時に、パラレル実行のために起動および予約するパラレル実行プロセス数を指定します。この設定の値を大きくすると、パラレル文の起動コストを均衡化するのに役立ちますが、パラレル実行プロセスはデータベースが停止されるまで削除されないため、必要なメモリー使用量は増大します。

PARALLEL_MIN_PERCENT

0

パラレル実行に必要なリクエストされたパラレル実行プロセスの最小パーセンテージを指定します。デフォルト値は0で、使用可能なパラレル・サーバー・プロセスがない場合、パラレル文はシリアルで実行されます。

PARALLEL_MIN_TIME_THRESHOLD

AUTO

オプティマイザによって見積もられた実行時間を指定します。これより大きい値の場合、文は自動パラレル問合せおよび自動DOP導出の候補となります。

PARALLEL_SERVERS_TARGET

「PARALLEL_SERVERS_TARGET」を参照してください。

パラレル文のキューイングが使用されるまでに問合せを実行するのに使用可能なパラレル実行サーバー・プロセスの数を指定します。文のキューイングは、PARALLEL_DEGREE_POLICYAUTOに設定されている場合にのみアクティブ化されることに注意してください。

PARALLEL_THREADS_PER_CPU

2

パラレル実行中にCPUが処理できるパラレル実行プロセスまたはスレッドの数を示します。

一部のパラメータの設定方法によってはOracle Databaseが制約を受けます。たとえば、PROCESSESを20に設定すると、25個の子プロセスを取得できなくなります。

関連項目:

初期化パラメータの詳細は、Oracle Databaseリファレンスを参照

8.6.2 セッションでのパラレル実行の強制

セッションでのパラレル実行を強制できます。

パラレルで実行する必要があるが、表に対するDOPの設定または関連する問合せの変更を避けたい場合は、次の文を使用して並列処理を強制できます。

ALTER SESSION FORCE PARALLEL QUERY;

この後のすべての問合せは、制限に違反しないかぎりパラレルで実行されます。DML文およびDDL文も強制できます。この句は、セッションの後続の文に指定されるすべてのパラレル句よりも優先されますが、パラレル・ヒントに対しては優先されません。

たとえば、一般的なOLTP環境では表にはパラレルの設定がありませんが、毎晩バッチ・スクリプトを使用してこのような表からデータをパラレルで収集する場合があります。セッション中にDOPを設定することで、ユーザーは、各表をパラレルで変更してから、終了時にシリアルに戻す必要がなくなります。

8.6.3 パラレル実行のための一般的なパラメータのチューニング

このトピックでは、パラレル実行の一般的なパラメータのチューニングについて説明します。

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

8.6.3.1 パラレル操作のリソース制限を設定するパラメータ

リソース制限を決定するための初期化パラメータを設定できます。

リソース制限を設定するパラメータを次で説明します。

関連項目:

初期化パラメータの詳細は、『Oracle Databaseリファレンス』を参照してください

8.6.3.1.1 PARALLEL_FORCE_LOCAL

PARALLEL_FORCE_LOCALパラメータは、パラレルで実行されるSQL文がOracle RAC環境のシングル・インスタンスに制限されるかどうかを示します。

このパラメータをTRUEに設定することにより、問合せコーディネータが実行しているシングルOracle RACインスタンスのために処理されるパラレル・スレーブのスコープを制限できます。

PARALLEL_FORCE_LOCALパラメータの推奨値はFALSEです。

関連項目:

PARALLEL_FORCE_LOCAL初期化パラメータの詳細は、『Oracle Databaseリファレンス』を参照してください

8.6.3.1.2 PARALLEL_MAX_SERVERS

PARALLEL_MAX_SERVERSパラメータには、1つのインスタンスに対するパラレル実行プロセスおよびパラレル・リカバリ・プロセスの最大数を指定します。

需要が増加するにつれて、インスタンスの起動時に作成された数からこの値までプロセス数が増加します。

たとえば、この値を64に設定した場合、各問合せが2つのスレーブ・セットを使用し、各セットのDOPが8とすると、4つのパラレル問合せを同時に実行できるようになります。

関連項目:

PARALLEL_MAX_SERVERS初期化パラメータの詳細は、『Oracle Databaseリファレンス』を参照してください

8.6.3.1.2.1 ユーザーのプロセスが多すぎる場合

同時ユーザーの問合せサーバー・プロセスが多すぎると、メモリー競合(ページング)、I/O競合または過剰なコンテキストのスイッチングが発生することがあります。

この競合により、パラレル実行が使用されなかった場合のレベルよりもシステム・スループットが低下する可能性があります。PARALLEL_MAX_SERVERS値を増やすのは、それによって生成されるロードのための十分なメモリーおよびI/O帯域幅がシステムにある場合のみにしてください。

オペレーティング・システムのパフォーマンス・モニタリング・ツールを使用すると、メモリー、スワップ領域およびI/O帯域幅の空き状況を判別できます。CPUとディスク両方の実行キューの長さ、およびシステムのI/O処理のサービス時間を調べます。プロセスを追加する場合は、システムに十分なスワップ領域があることを確認します。問合せサーバー・プロセスの総数を制限すると、パラレル操作を実行できる同時ユーザー数が制限されることがありますが、システム・スループットは安定するようになります。

8.6.3.1.2.2 コンシューマ・グループを使用したユーザーに対するリソース数の制限時期

必要な場合、ユーザーに対してリソース・コンシューマ・グループを設定することで、所定のユーザーが使用可能な並列処理の量を制限できます。

これは、1ユーザーまたは1ユーザー・グループが使用できる、セッション数、同時ログオンおよびパラレル・プロセス数を制限するために行います。

パラレル実行文を処理する各問合せサーバー・プロセスは、セッションIDを使用してログオンしています。各プロセスは、ユーザーの同時セッションの制限に対してカウントされます。たとえば、あるユーザーが使用できるパラレル実行プロセスを10個に制限するには、ユーザーの制限を11に設定します。1プロセスがパラレル実行コーディネータ用、その他の10プロセスが2セットの問合せサーバーを構成します。こうすると、パラレル実行コーディネータが1セッション、パラレル実行プロセスが10セッションを使用できます。

関連項目:

8.6.3.1.3 PARALLEL_MIN_PERCENT

PARALLEL_MIN_PERCENTパラメータにより、使用中のアプリケーションに応じて、許容できるDOPを待機できます。

PARALLEL_MIN_PERCENTパラメータの推奨値は0です。このパラメータを0以外の値に設定すると、リクエストされたDOPがその時点でシステムによって実現されない場合、Oracle Databaseがエラーを返します。たとえば、PARALLEL_MIN_PERCENTを50(50パーセント)に設定したときに、マルチユーザー問合せ調整アルゴリズムまたはリソース制限によってDOPが50パーセントを超えて低減されると、Oracle DatabaseによってORA-12827が返されます。例:

SELECT /*+ FULL(e) PARALLEL(e, 8) */ d.department_id, SUM(SALARY)
  FROM employees e, departments d WHERE e.department_id = d.department_id
  GROUP BY d.department_id ORDER BY d.department_id; 

Oracle Databaseから次のメッセージが返されます。

ORA-12827: insufficient parallel query slaves available

関連項目:

PARALLEL_MIN_PERCENT初期化パラメータの詳細は、『Oracle Databaseリファレンス』を参照してください

8.6.3.1.4 PARALLEL_MIN_SERVERS

PARALLEL_MIN_SERVERSパラメータは、1つのインスタンスで、パラレル操作のために起動および予約するプロセス数を指定します。

PARALLEL_MIN_SERVERSの設定により、メモリー使用量と起動コストのバランスを保つことができます。PARALLEL_MIN_SERVERSを使用して起動されるプロセスは、データベースが停止されるまで終了しません。これによって、問合せが発行されるときには、多くの場合、プロセスが使用可能になっています。

関連項目:

PARALLEL_MIN_SERVERS初期化パラメータの詳細は、『Oracle Databaseリファレンス』を参照してください

8.6.3.1.5 PARALLEL_MIN_TIME_THRESHOLD

PARALLEL_MIN_TIME_THRESHOLDパラメータには、文が自動並列度の対象とみなされるまでの最小実行時間を指定します。

関連項目:

PARALLEL_MIN_TIME_THRESHOLD初期化パラメータの詳細は、『Oracle Databaseリファレンス』を参照してください

8.6.3.1.6 PARALLEL_SERVERS_TARGET

PARALLEL_DEGREE_POLICYパラメータは、パラレル文のキューイングが使用されるまでにパラレル文を実行できるパラレル・サーバー・プロセスの数を指定します。

PARALLEL_DEGREE_POLICYAUTOに設定されていると、システムで現在使用されているパラレル・プロセスの数がPARALLEL_SERVERS_TARGET以上の場合、パラレル実行の必要な文はキューに入れられます。これはシステムで許可されているパラレル・サーバー・プロセスの最大数ではありません(それはPARALLEL_MAX_SERVERSによって制御されます)。ただし、PARALLEL_SERVERS_TARGETおよびパラレル文のキューイングを使用すると、パラレル実行の必要なそれぞれの文が必要なパラレル・サーバー・リソースに割り当てられ、パラレル・サーバー・プロセスの過多によるフラッドを防止できます。

関連項目:

PARALLEL_SERVERS_TARGET初期化パラメータの詳細は、『Oracle Databaseリファレンス』を参照してください

8.6.3.1.7 SHARED_POOL_SIZE

SHARED_POOL_SIZEパラメータは、共有プールのメモリー・サイズを指定します。

パラレル実行では、シリアルSQL実行で必要なメモリー・リソースに加えてさらにメモリー・リソースが必要です。追加のメモリーは、問合せサーバー・プロセスと問合せコーディネータ間での通信とデータの受渡しに使用されます。

Oracle Databaseによって、共有プールから問合せサーバー・プロセスにメモリーが割り当てられます。次のように共有プールをチューニングします。

  • 共有プールの他のクライアント(共有カーソルやストアド・プロシージャなど)を考慮します。

  • 大きな値ではマルチユーザー・システムでのパフォーマンスが向上しますが、小さな値ではメモリー使用量が減ることに注意します。

  • その後、パラレル実行で使用されるバッファ数を監視し、shared pool PX msg poolと、ビューV$PX_PROCESS_SYSSTATの出力に示されている現在の最高水位標を比較します。

    ノート:

    使用可能な十分なメモリーがない場合は、エラー・メッセージ12853(「PXバッファのメモリーが不足しています: 現在はstringKBですが、最大stringKBが必要です」)が生成されます。これは、PXバッファのためのSGAメモリーが十分でない場合に発生します。少なくとも(MAX - CURRENT)バイトを追加するようにSGAメモリーを再構成する必要があります。

デフォルトでは、Oracle Databaseはパラレル実行バッファを共有プールから割り当てます。

Oracle Databaseで起動時に次のエラーが表示された場合、SHARED_POOL_SIZEの値を、データベースが起動できるように十分に下げる必要があります。

ORA-27102: out of memory 
SVR4 Error: 12: Not enough space 

SHARED_POOL_SIZEの値を下げた後で、次のエラーが発生する場合があります。

ORA-04031: unable to allocate 16084 bytes of shared memory 
   ("SHARED pool","unknown object","SHARED pool heap","PX msg pool") 

その場合は、次の問合せを実行して、Oracle Databaseが16,084バイトを割り当てられなかった理由を判別します。

SELECT NAME, SUM(BYTES) FROM V$SGASTAT WHERE UPPER(POOL)='SHARED POOL' 
  GROUP BY ROLLUP (NAME); 

出力は次のようになります。

NAME                       SUM(BYTES) 
-------------------------- ---------- 
PX msg pool                   1474572 
free memory                    562132
                              2036704 

SHARED_POOL_SIZEを指定したときに、保持するよう指定したメモリー容量がプールよりも大きい場合、Oracle Databaseでは、取得できるメモリーのすべてを割り当てません。一部の領域が残されます。問合せが実行されるとき、Oracle Databaseは必要なメモリーを取得しようとします。Oracle Databaseは560KBを使用し、失敗するとさらに16KBが必要になります。このエラーでは、必要とされた容量の累積は報告されません。必要な追加メモリー容量を判別する最適な方法としては、「メッセージ・バッファに必要なメモリー」の式を使用します。

この例の問題を解決するには、SHARED_POOL_SIZEの値を増やします。サンプル出力に表示されるように、SHARED_POOL_SIZEは約2MBです。使用可能なメモリー容量によって異なりますが、SHARED_POOL_SIZEの値を4MBに増やしてから、データベースの起動を試行してください。Oracle Databaseで引き続きORA-4031メッセージが表示される場合は、起動が成功するまでSHARED_POOL_SIZEの値を次第に増やします。

関連項目:

SHARED_POOL_SIZE初期化パラメータの詳細は、『Oracle Databaseリファレンス』を参照してください

8.6.3.1.8 メッセージ・バッファの追加メモリー要件

このトピックでは、パラレル実行計画を使用する際のメッセージ・バッファおよびカーソル用の追加メモリー要件について説明します。

共有プールの初期設定を決定したら、メッセージ・バッファの追加メモリー要件を計算し、カーソル用に必要な追加領域の容量を決定する必要があります。

8.6.3.1.8.1 メッセージ・バッファに必要なメモリー

このトピックでは、パラレル実行計画を使用する際にメッセージ・バッファに必要なメモリーについて説明します。

メッセージ・バッファを収容できるようにSHARED_POOL_SIZEパラメータの値を増やす必要があります。メッセージ・バッファによって、問合せサーバー・プロセスが相互に通信できます。

Oracle Databaseでは、プロデューサ問合せサーバーとコンシューマ問合せサーバーの間の仮想接続ごとに一定数のバッファが使用されます。接続数は、DOPの増加に合せてその2乗の数に増加します。この理由から、パラレル実行で使用されるメモリーの最大容量は、システムで許可されるDOPの最大値によって制限されます。この値を制御するには、PARALLEL_MAX_SERVERSパラメータを使用するか、ポリシーとプロファイルを使用します。

必要なメモリー容量を計算するには、次のいずれかの計算式を使用します。

  • SMPシステム:

    mem in bytes = (3 x size x users x groups x connections)
    
  • Oracle Real Application ClustersおよびMPPシステム:

    mem in bytes = ((3 x local) + (2 x remote)) x (size x users x groups) 
      / instances
    

各インスタンスで、この式で計算されたメモリーが使用されます。

用語の意味は次のとおりです。

  • SIZE = PARALLEL_EXECUTION_MESSAGE_SIZE

  • USERS = DOPが最適な場合に実行が予想される同時パラレル実行ユーザー数

  • GROUPS = 各問合せで使用される問合せサーバー・プロセス・グループ数

    単純なSQL文で必要になるのは1グループのみです。ただし、問合せに関連する副問合せがパラレルで処理される場合、Oracle Databaseはもう1つの問合せサーバー・プロセス・グループを使用します。

  • CONNECTIONS = (DOP2 + 2 x DOP)

    システムがクラスタまたはMPPの場合は、インスタンス数を考慮する必要があります。インスタンス数によってDOPが増加するためです。つまり、2つのインスタンス・クラスタでDOPを4にすると、結果としてDOPが8になります。控えめな見積りとして、初期値にはPARALLEL_MAX_SERVERSとインスタンス数を掛けて4で割った値を使用することをお薦めします。

  • LOCAL = CONNECTIONS/INSTANCES

  • REMOTE = CONNECTIONS - LOCAL

共有プールの元の設定にこの容量を追加します。ただし、これらのメモリー構造体いずれかの値を設定する前に、次の項で説明するカーソル用の追加メモリーも考慮する必要があります。

8.6.3.1.8.2 カーソルの追加メモリー

このトピックでは、パラレル実行計画を使用する際のカーソル用の追加メモリーについて説明します。

パラレル実行計画は、シリアル実行計画よりもSQL領域を多く消費します。共有プール・リソース使用状況を定期的に監視して、メッセージとカーソルの両方で使用されるメモリーがシステムの処理要件を満たすことを確認します。

8.6.3.1.9 処理開始後のメモリー使用状況の監視

自動チューニングと手動チューニングのどちらを使用するにしても、実行時の使用状況を監視して、メモリーのサイズが大きすぎないか、小さすぎないかを確認する必要があります。

この項の計算式はあくまで開始値を設定するためのものです。正しいメモリー・サイズを確認するため、次の問合せを使用して共有プールをチューニングします。

SELECT POOL, NAME, SUM(BYTES) FROM V$SGASTAT WHERE POOL LIKE '%pool%'
  GROUP BY ROLLUP (POOL, NAME);

出力は次のようになります。

POOL        NAME                       SUM(BYTES) 
----------- -------------------------- ---------- 
shared pool Checkpoint queue                38496 
shared pool KGFF heap                        1964 
shared pool KGK heap                         4372 
shared pool KQLS heap                     1134432 
shared pool LRMPD SGA Table                 23856 
shared pool PLS non-lib hp                   2096 
shared pool PX subheap                     186828 
shared pool SYSTEM PARAMETERS               55756 
shared pool State objects                 3907808 
shared pool character set memory            30260 
shared pool db_block_buffers               200000 
shared pool db_block_hash_buckets           33132 
shared pool db_files                       122984 
shared pool db_handles                      52416 
shared pool dictionary cache               198216 
shared pool dlm shared memory             5387924 
shared pool event statistics per sess      264768 
shared pool fixed allocation callback        1376 
shared pool free memory                  26329104 
shared pool gc_*                            64000 
shared pool latch nowait fails or sle       34944 
shared pool library cache                 2176808 
shared pool log_buffer                      24576 
shared pool log_checkpoint_timeout          24700 
shared pool long op statistics array        30240 
shared pool message pool freequeue         116232 
shared pool miscellaneous                  267624 
shared pool processes                       76896 
shared pool session param values            41424 
shared pool sessions                       170016 
shared pool sql area                      9549116 
shared pool table columns                  148104 
shared pool trace_buffers_per_process     1476320 
shared pool transactions                    18480 
shared pool trigger inform                  24684 
shared pool                              52248968 
                                         90641768 

出力に表示されたメモリー使用量を評価し、処理ニーズに基づいてSHARED_POOL_SIZEの設定を変更します。

メモリー使用量の統計をさらに取得するには、次の問合せを実行します。

SELECT * FROM V$PX_PROCESS_SYSSTAT WHERE STATISTIC LIKE 'Buffers%';

出力は次のようになります。

STATISTIC                           VALUE 
-------------------                 ----- 
Buffers Allocated                   23225 
Buffers Freed                       23225 
Buffers Current                         0 
Buffers HWM                          3620 

使用されたメモリー容量は、Buffers CurrentBuffers HWMの統計に表示されます。バッファ数にPARALLEL_EXECUTION_MESSAGE_SIZEの値を掛けた値(バイト数)を計算します。この最高水位標をパラレル実行メッセージ・プール・サイズと比較して、割当てメモリーが多すぎないかを判別します。たとえば、最初の出力で、px msg poolに示されるラージ・プールの値は38,092,812すなわち38MBです。2番目の出力のBuffers HWMは3,620です。これにパラレル実行メッセージ・サイズの4,096を掛けると、14,827,520すなわち約15MBになります。この場合、最高水位標は容量の約40パーセントに達しています。

8.6.3.2 リソース消費に影響するパラメータ

このトピックでは、リソース消費に影響するパラメータについて説明します。

ノート:

次の項を検討する前に、詳細についてMEMORY_TARGETおよびMEMORY_MAX_TARGET初期化パラメータの説明を参照してください。MEMORY_TARGETによってSGAコンポーネントおよびPGAコンポーネントが自動チューニングされるため、PGA_AGGREGATE_TARGET初期化パラメータを設定する必要はありません。

ここで説明するパラメータの最初のグループは、すべてのパラレル操作(特にパラレル実行)のメモリーとリソースの消費に影響します。これらのパラメータは次のとおりです。

パラメータの2つ目のサブセットについては、「パラレルDMLおよびパラレルDDLのリソース消費に影響するパラメータ」で説明しています。

リソース消費を制御するには、次の2つのレベルでメモリーを構成する必要があります。

  • データベース・レベル。データベース・システムがオペレーティング・システムの適切な容量のメモリーを使用できるようにします。

  • オペレーティング・システム・レベル(一貫性のため)。

    プラットフォームによっては、使用可能な仮想メモリーの合計容量(全プロセスの合計)を制御するオペレーティング・システム・パラメータを設定する必要があります。

データ・ウェアハウス操作で使用されるメモリーの大きな部分は(OLTPと比べて)動的に使用されます。このメモリーはプロセス・グローバル領域(PGA)から割り当てられ、プロセス・メモリーのサイズとプロセスの数はどちらも幅広い範囲で変化する可能性があります。そのような場合は、PGA_AGGREGATE_TARGET初期化パラメータを使用して、プロセス・メモリーとプロセス数の両方を制御します。PGA_AGGREGATE_TARGETMEMORY_TARGETを合せて明示的に設定すると、自動チューニングは行われますが、PGA_AGGREGATE_TARGETが指定値未満になるようにチューニングされることはありません。

関連項目:

8.6.3.2.1 PGA_AGGREGATE_TARGET

PGA_AGGREGATE_TARGETなどの初期化パラメータの設定により、自動PGAメモリー管理を有効にできます。

自動PGAメモリー管理を有効にすると、PGAメモリーの割当て方法が単純化されて強化されます。このモードでは、DBAによって明示的に設定されたPGAメモリー全体の目標に基づいて、Oracle DatabaseがPGAメモリーの作業領域専用部分のサイズを動的に調整します。自動PGAメモリー管理を有効にするには、PGA_AGGREGATE_TARGET初期化パラメータを設定する必要があります。新しいインストールでは、PGA_AGGREGATE_TARGETおよびSGA_TARGETは自動的にDatabase Configuration Assistant (DBCA)によって設定されます。MEMORY_TARGETは0です。つまり、自動メモリー管理は無効になっています。したがって、集計PGAの自動チューニングはデフォルトで有効になっています。ただし、集計PGAは、MEMORY_TARGETを0以外の値に設定して自動メモリー管理を有効にしないかぎり、増えることはありません。

関連項目:

8.6.3.2.1.1 HASH_AREA_SIZE

このパラメータは現在非推奨になっています。

HASH_AREA_SIZEは非推奨です。かわりにPGA_AGGREGATE_TARGETを使用してください。詳細は、PGA_AGGREGATE_TARGETを参照してください。

8.6.3.2.1.2 SORT_AREA_SIZE

このパラメータは現在非推奨になっています。

SORT_AREA_SIZEは非推奨です。かわりにPGA_AGGREGATE_TARGETを使用してください。詳細は、PGA_AGGREGATE_TARGETを参照してください。

8.6.3.2.2 PARALLEL_EXECUTION_MESSAGE_SIZE

PARALLEL_EXECUTION_MESSAGE_SIZEパラメータでは、パラレル実行メッセージで使用されるバッファのサイズを指定します。

PARALLEL_EXECUTION_MESSAGE_SIZEのデフォルト値は、オペレーティング・システム固有ですが、通常、16Kです。この値はほとんどのアプリケーションで適切です。

関連項目:

PARALLEL_EXECUTION_MESSAGE_TIME初期化パラメータの詳細は、『Oracle Databaseリファレンス』を参照してください

8.6.3.2.3 パラレルDMLおよびパラレルDDLのリソース消費に影響するパラメータ

このトピックでは、パラレルDMLおよびパラレルDDL操作のリソース消費に影響するパラメータについて説明します。

パラレルDMLおよびパラレルDDLのリソース消費に影響するパラメータを次に示します。

パラレルの挿入、更新および削除操作では、シリアルDML操作よりも多くのリソースが必要です。同じく、PARALLEL CREATE TABLE AS SELECTおよびPARALLEL CREATE INDEXでも、より多くのリソースが必要となることがあります。このため、場合によっては、さらにいくつかの初期化パラメータの値を増やす必要があります。これらのパラメータは問合せのためのリソースには影響しません

関連項目:

初期化パラメータの詳細は、『Oracle Databaseリファレンス』を参照してください

8.6.3.2.3.1 TRANSACTIONS

TRANSACTIONSパラメータは、パラレルDMLおよびDDLでのトランザクション数に影響します。

パラレルのDMLおよびDDLでは、各問合せサーバー・プロセスがトランザクションを開始します。パラレル実行コーディネータは2フェーズのコミット・プロトコルを使用してトランザクションをコミットします。このため、処理されるトランザクション数はDOPに応じて増加します。この結果、TRANSACTIONS初期化パラメータの値を増やす必要が生じることがあります。

TRANSACTIONSパラメータでは、同時トランザクションの最大数を指定します。TRANSACTIONSのデフォルト値は、並列なしを想定しています。たとえば、DOPが20の場合は、追加の新しいサーバー・トランザクション20(サーバー・セットが2つの場合は40)とコーディネータ・トランザクション1が生成されます。この場合、トランザクションが同一インスタンスで実行されているときは、TRANSACTIONSに21(または41)を加えた値に増やします。このパラメータを設定しない場合は、Oracle Databaseによって値が1.1 x SESSIONSになるように設定されます。サーバー管理のUNDOを使用している場合、この説明は適用されません。

8.6.3.2.3.2 FAST_START_PARALLEL_ROLLBACK

コミットされていないパラレルDMLまたはパラレルDDLトランザクションがあるときにシステムで障害が発生した場合に、FAST_START_PARALLEL_ROLLBACKパラメータを使用して、起動時のトランザクションのリカバリを高速化できます。

FAST_START_PARALLEL_ROLLBACKパラメータは、終了したトランザクションをリカバリするときに使用するDOPを制御します。異常終了したトランザクションとは、システム障害の前にアクティブだったトランザクションです。デフォルトでは、最大でCPU_COUNTパラメータ値の2倍になるようにDOPが選択されます。

このデフォルトDOPが不十分な場合は、パラメータをHIGHに設定します。これにより、最大DOPがCPU_COUNTパラメータの4倍になります。この機能はデフォルトで使用できます。

8.6.3.2.3.3 DML_LOCKS

DML_LOCKSパラメータは、パラレルDML操作によって保持されるロック数を含むように設定する必要があります。

DML_LOCKSパラメータは、DMLロックの最大数を指定します。この値は、すべてのユーザーが参照するすべての表でのロック数の合計と等しくなるように指定する必要があります。パラレルDML操作のロック要件は、シリアルDMLの要件と大きく異なります。パラレルDMLで保持されるブロックはかなり多いため、DML_LOCKSパラメータの値を倍量に増やす必要があります。

ノート:

ターゲット表の表ロックが使用禁止の場合、パラレルDML操作は実行されません。

表8-4に、様々なパラレルDML文ごとにコーディネータとパラレル実行サーバー・プロセスによって取得されるロックの種類を示します。この情報を使用して、このようなパラメータで必要な値を決定することができます。

表8-4 パラレルDML文で取得されるロック

文のタイプ コーディネータ・プロセスが取得するロック 各パラレル実行サーバーが取得するロック

パーティション表に対するパラレルUPDATEまたはDELETE(WHERE句によりパーティションまたはサブパーティションのサブセットにプルーニング)

1つの表ロックSX

プルーニングされたパーティションまたはサブパーティション当たり1つのパーティション・ロックX

1つの表ロックSX

問合せサーバー・プロセスが所有するプルーニングされたパーティションまたはサブパーティション当たり1つのパーティション・ロックNULL

問合せサーバー・プロセスが所有するプルーニングされたパーティションまたはサブパーティション当たり1つのパーティション待機ロックS

パーティション表に対するパラレル行移行UPDATE(WHERE句によりパーティションまたはサブパーティションのサブセットにプルーニング)

1つの表ロックSX

プルーニングされたパーティションまたはサブパーティション当たり1つのパーティション・ロックX

他のすべてのパーティションまたはサブパーティションの1つのパーティション・ロックSX

1つの表ロックSX

問合せサーバー・プロセスが所有するプルーニングされたパーティションまたはサブパーティション当たり1つのパーティション・ロックNULL

問合せサーバー・プロセスが所有するプルーニングされたパーティション当たり1つのパーティション待機ロックS

他のすべてのパーティションまたはサブパーティションの1つのパーティション・ロックSX

パーティション表に対するパラレルUPDATEMERGEDELETEまたはINSERT

1つの表ロックSX

すべてのパーティションまたはサブパーティションのパーティション・ロックX

1つの表ロックSX

パーティションまたはサブパーティション当たり1つのパーティション・ロックNULL

パーティションまたはサブパーティション当たり1つのパーティション待機ロックS

パーティション表に対するパラレルINSERT(目的の表はパーティション句またはサブパーティション句を含む)

1つの表ロックSX

指定されたパーティションまたはサブパーティション当たり1つのパーティション・ロックX

1つの表ロックSX

指定されたパーティションまたはサブパーティション当たり1つのパーティション・ロックNULL

指定されたパーティションまたはサブパーティション当たり1つのパーティション待機ロックS

非パーティション表に対するパラレルINSERT

1つの表ロックX

なし

ノート:

表、パーティションおよびパーティション待機のDMLロックはすべて、TMロックとしてV$LOCKビューに表示されます。

DOPを100として実行する600のパーティションを含む表について検討します。すべてのパーティションが、行移行のないパラレルUPDATE文またはDELETE文に関連するとします。

コーディネータでは次のロックが取得されます。

  • 1つの表ロックSX

  • 600のパーティション・ロックX

サーバー・プロセス全体では次のロックが取得されます。

  • 100の表ロックSX

  • 600のパーティション・ロックNULL

  • 600のパーティション待機ロックS

8.6.3.3 I/Oに関連するパラメータ

このトピックでは、I/Oに影響するパラメータについて説明します。

I/Oに影響するパラメータを次に示します。

これらのパラメータは、パラレル実行I/O操作の最適なパフォーマンスを確保するオプティマイザにも影響します。

関連項目:

初期化パラメータの詳細は、『Oracle Databaseリファレンス』を参照してください

8.6.3.3.1 DB_CACHE_SIZE

DB_CACHE_SIZEパラメータは、バッファのDEFAULTバッファ・プールのサイズをプライマリ・ブロック・サイズで設定します。

パラレルの更新、マージおよび削除操作を実行するとき、バッファ・キャッシュの動作は、大容量の更新を実行するOLTPシステムと非常によく似ています。

8.6.3.3.2 DB_BLOCK_SIZE

DB_BLOCK_SIZEパラメータは、Oracleデータベース・ブロックを設定します。

このパラメータの推奨値は8KBまたは16KBです。

データベース・ブロック・サイズはデータベースを作成するときに設定します。新しいデータベースを作成する場合は、8KBまたは16KBの大きなブロック・サイズを使用します。

8.6.3.3.3 DB_FILE_MULTIBLOCK_READ_COUNT

DB_FILE_MULTIBLOCK_READ_COUNTパラメータでは、オペレーティング・システムのREADコール1回で読み取られるデータベース・ブロック数を決定します。

このパラメータのデフォルト値は効率よく実行できる最大I/Oサイズに対応する値です。最大I/Oサイズの値はプラットフォームによって異なり、ほとんどのプラットフォームで1MBです。DB_FILE_MULTIBLOCK_READ_COUNTに設定した値が高すぎる場合、データベースの起動時に、オペレーティング・システムによって許容範囲内の最高レベルまで値が下げられます。

8.6.3.3.4 DISK_ASYNCH_IOおよびTAPE_ASYNCH_IO

DISK_ASYNCH_IOおよびTAPE_ASYNCH_IOパラメータにより、オペレーティング・システムの非同期I/O機能を有効化または無効化できます。

DISK_ASYNCH_IOTAPE_ASYNCH_IOパラメータの両方の推奨値はTRUEです。これらのパラメータによって、問合せサーバー・プロセスが、表スキャンを実行するときにI/Oリクエストと処理を同時に行うことができます。オペレーティング・システムで非同期I/Oがサポートされる場合は、これらのパラメータをデフォルト値のTRUEにしておきます。図8-6に、非同期読取りの仕組みを示します。

非同期操作が現在サポートされているのは、パラレル表スキャン、ハッシュ結合、ソートおよびシリアル表スキャンです。ただし、この機能にはオペレーティング・システム固有の構成が必要となることがあり、すべてのプラットフォームでサポートされるとはかぎりません。