連載
» 2007年01月25日 00時00分 公開

パーティショニングとパラレル処理は最高の相性Oracleパーティショニング実践講座(3)(4/4 ページ)

[大久保正雄,アシスト]
前のページへ 1|2|3|4       

パラレルDML

 パラレルDMLでは、副問い合わせを含む行の追加(insert as select)、更新(update)、削除(delete)、問い合わせ結果からの追加更新(merge)の処理が可能です。また図12のようにinsert文はダイレクトロードインサート(バッファ・キャッシュを経由せずに直接データファイルに書き込む)の処理となります。

図12 パラレルDMLの処理の流れ 図12 パラレルDMLの処理の流れ

コラム:Oracleバージョンによる制限

Oracle9i Database R9.0.1以前までは、パラレルDMLの更新、削除、追加更新には以下の制限がありました。

  • 操作するパーティション数を超える並列度で処理できない(パーティション数に限定)
  • 非パーティション表に対してはパラレル化できない

Oracle9i Database R9.2.0以降ではこの制限がなくなり、以下のことが可能となりました。

  • パーティション数を超える並列度でパラレルDMLを実行
  • 非パーティション表に対してパラレルDMLを実行

コラム:セッション単位によるパラレル実行の指定

パラレル処理はSQL内に直接ヒント句を記述することで実行できますが、セッション単位で指定することも可能です。以下のalter文で、後続のSQL文をパラレルで実行できます。

-- SQL文のパラレル実行を可能にする
SQL> alter session enable parallel dml|ddl|query;

逆にenableをdisableにすることで使用禁止にできます。なおDMLに関しては、このalter session文を明示的に発行し、パラレルDMLを使用可能にした場合のみ、パラレル化できます。パラレルDMLを直接指定する場合、例えば次のように実行します。

-- パラレルDMLを直接指定する
SQL> INSERT /* APPEND PARALLEL (emp,2) */
     INTO emp SELECT * FROM emp_master@dblink;

上記のSQLでは、リモート環境のemp_master表をローカルのemp表に挿入する処理をパラレルに実行します。


パラレルDMLとロールバック・セグメント

 DMLをパラレルに実行する際、それぞれのパラレル実行サーバは独自のパラレル・プロセス・トランザクションで作業の一部を実行します。そのため、自動UNDO管理の代わりにロールバック・セグメントを使用する場合、パラレル実行サーバのトランザクションで利用されるロールバック・セグメントの競合を軽減しなければならない場合があります(図13)。

図13 ヘッダ競合を軽減するために複数のロールバック・セグメントが必要 図13 ヘッダ競合を軽減するために複数のロールバック・セグメントが必要

 このような場合、パラレルDMLを実施する並列度以上のロールバック・セグメントを用意し、ロールバック・セグメントの競合が発生しないような環境を整える必要があります。

パラレルロード

 パラレルロードは、主にSQL*Loaderで同一の表に同時にデータを挿入することを意味します。SQL*LoaderはCSV形式のデータをOracleの表に挿入(ロード)するユーティリティで、パラレルロードには2種類の方法があります。

従来型ロードの分割

 従来型ロードとは、insert文を実行してCSVデータをデータベースにロードする操作です。リスト3の場合、CSV形式の入力ファイルを3つのSQL*Loaderがそれぞれ読み込み、表に対して並列ロードすることを表しています。このケースでは制御ファイルが同じであるため、すべてのデータが同じ表にロードされますが、複数の表に同時にロードすることもできます。

sqlldr userid = scott/tiger control = load1.ctl data = demo1.dat parallel = true
sqlldr userid = scott/tiger control = load1.ctl data = demo2.dat parallel = true
sqlldr userid = scott/tiger control = load1.ctl data = demo3.dat parallel = true
リスト3 従来型ロードの実行コマンド

パラレルダイレクトロード

 バッファ・キャッシュを経由せずに直接データファイルに書き込むダイレクトロードを、複数のSQL*Loaderで並列して実行することをパラレルダイレクトロードと呼びます。SQL*Loaderの「parallel」オプションを「true」に設定することで、ダイレクトロード時に複数の同時セッションによって同じ表にデータをロードすることを許可します(リスト4)。

sqlldr userid = scott/tiger control = load1.ctl data = demo1.dat parallel = true direct = true
sqlldr userid = scott/tiger control = load1.ctl data = demo2.dat parallel = true = true
sqlldr userid = scott/tiger control = load1.ctl data = demo3.dat parallel = true = true
リスト4 パラレルダイレクトロードの実行コマンド

 このようなSQL*Loaderのパラレルロード処理は、データベースの移行やDSSおよびDWHなどのETL処理で利用されています。

パラレルData Pump Export/Import

 Oracle 10gからリリースされたData Pump Export/Importユーティリティ(以下、Data Pump)は、従来のExport/Importユーティリティと比べてより高速にデータをロード/アンロードすることが可能となりました。この高速なData Pumpをパラレル化することにより、さらに処理能力を向上させることも可能です。

図14 パラレルData Pump Export処理の流れ 図14 パラレルData Pump Export処理の流れ

 Data Pumpでは一連の処理をジョブとして扱います。Data Pumpのそれぞれのジョブが実行されると、まず1つのジョブにつき1つのマスター制御プロセスが作成されます。このプロセスはData Pumpのジョブの実行と順番の割り当てを制御します。

 ワーカープロセスは、ジョブの実行開始要求を受け取ると同時にマスター制御プロセスに作成されるプロセスで、マスター制御プロセスが要求する処理を同時に実行します。パラレル処理の場合には、このワーカープロセスが複数起動する仕組みとなっています。

最後に

 今回はパラレル処理の概要を中心に、機能、特徴、考慮点などをご説明しました。大規模データを高速に処理するためには、パラレル処理が非常に有用で、さまざまな活用方法があることはもちろんですが、何よりもパーティショニング環境において、その効果を最大限に発揮できることがお分かりいただければ幸いです。


 次回は、パラレルクエリ、パラレルDDL、パラレルDML、パラレルロード、パラレルData Dumpのそれぞれの検証結果を紹介します。


前のページへ 1|2|3|4       

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。