無料の「Oracle Database XE」で高速バッチ処理:活用のポイント

兒玉敏幸(101)
2008-08-15 16:09:01
  • このエントリーをはてなブックマークに追加

1-3. 自律型トランザクションの活用

 DDLの活用で説明したように、「CREATE TABLE AS SELECT」を使ってコンポーネントを実装する場合、バッチ処理全体が正常に終了した時は問題ないのですが、どこかでエラーが発生した場合はCREATE TABLE文の実行毎に、自動的にCOMMITが発行されるためリカバリーが煩雑になります。

 処理全体が1つのトランザクションとなればどこかでエラーが発生すると処理内容がロールバックされるので、非常にシンプルでエラー時のリカバリーが煩雑になることもありません。

 そこで有効な機能が自律型トランザクションです。

 自律型トランザクションとは、任意のトランザクションから開始される独立したトランザクションです。PL/SQLブロックで「PRAGMA AUTONOMOUS_TRANSACTION」と宣言することで、自律型トランザクションが開始されます。

 自律型トランザクションの宣言後、中間テーブルを作成すれば、呼び出し元のトランザクションに影響のない独立したトランザクションとして、DDLであるCREATE TABLE文を実行できます。

 さらに一時表と自律型トランザクションを組み合わせることで、非常にシンプルでパフォーマンスにすぐれたコンポーネントを作成することができます。以下に組み合わせで記述した例を示します。

 1  DECLARE
 2    table_not_exist exception;
 3    PRAGMA EXCEPTION_INIT(table_not_exist, -942);
 4    PRAGMA AUTONOMOUS_TRANSACTION;
 5  BEGIN
 6    EXECUTE IMMEDIATE 'insert into EMP_データ抽出 as SELECT * FROM EMP;
 7    COMMIT;
 8  EXCEPTION
 9  WHEN table_not_exist THEN
10    EXECUTE IMMEDIATE 'create GLOBAL TEMPORARY table EMP_データ抽出 ON COMMIT PRESERVE ROWS as SELECT * FROM EMP;
11  END;
12  /

 この例のようなコンポーネントを用意することで、呼び出し元のメインのトランザクションから独立したトランザクションとして中間テーブルを作成することができます。

 テーブルが存在しなかった場合に備え、2〜3行目で一時表を作成するために例外の宣言をします。

 4行目が自律型トランザクションの宣言です。自律型トランザクションの宣言はPL/SQLブロックで実行する必要があります。

 6行目は対象データのみを一時表へ挿入するためのSQLです。ここでは抽出条件を指定していませんが、対象データの条件を適宜指定します。

 10行目は一時表が存在しなかった場合に作成するためのSQLです。「ON COMMIT PRESERVE ROWS」は、セッション終了時にデータを削除するための指定です。

 このように、若干複雑で冗長な感じにはなりますが、これらを自動出力する仕組みがあれば問題にはなりません。

 ワン・オー・ワンのバッチアプリケーション開発ツールである101willでは、Excelシート「共通情報」の「トランザクション属性」の値を「全体」と指定するだけで、一時表や自律型トランザクションの使用を意識しなくとも、この例のようなスクリプトを自動出力します。

 無料版でも確認できますので興味のある方は是非お試しください。

1-4. 外部表の活用

 外部表(External Table)とは、データベースの外にあるOSファイルに対して、データベース内にある通常のテーブルのようにSQLでアクセスできるOracleデータベースの機能です。

 Oracleのマニュアルには「外部表機能は、既存のSQL*Loader機能を補足する機能です」と書いてありますが、バッチ処理でOSファイルを入力データとして扱う際には是非活用したい機能です。

 外部表はアクセスされると毎回読み込み操作が行われるため、何度も参照されるような使い方には向いてませんが、データの変換をしてその結果を永続表に保存するという使い方では、キャッシュをムダに使うことも無いためとても効率的です。

 外部ファイルからのデータを加工するバッチ処理の場合、SQL*Loaderでロードした際には、ロードとその後の加工処理を1つのトランザクションとして扱うことはできません。しかし、外部表の場合はあたかも通常のテーブルのようにアクセスできるので、全体を1つのトランザクションとして実行できるようになります。

 バッチ処理全体を1つのトランザクションにできれば、エラー発生時には単純に再実行するというシンプルな考え方で例外処理を実装できるため、メンテナンス性も向上します。

このサイトでは、利用状況の把握や広告配信などのために、Cookieなどを使用してアクセスデータを取得・利用しています。 これ以降ページを遷移した場合、Cookieなどの設定や使用に同意したことになります。
Cookieなどの設定や使用の詳細、オプトアウトについては詳細をご覧ください。
[ 閉じる ]