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

兒玉敏幸(101)
2008-07-24 17:00:00
  • このエントリーをはてなブックマークに追加

1-4. ループをなくそう

 JavaやCなどの一般的なプログラミング言語で、ループ処理なしでプログラムを作成してくださいと言われると困惑すると思います。しかしデータベースを利用する場合はループ処理を使用しなくとも、比較的簡単に実装することができます。

 ループ処理や分岐処理はどのようなケースで必要になるでしょうか?

 例えば件数分の処理をする際にループさせたり、そのループ内で処理対象のデータか判定するために分岐処理を使ったりすることが多いでしょう。

 SQL文にはループ処理が無いため(もちろんPL/SQLにはあります)、プログラミング言語で記述したロジックでループや分岐を行い、SQL文ではデータ操作のみを行っているプログラムが多いのではないでしょうか。

 データベースを活用するには今までのプログラミングの考え方をちょっと変えてみてください。バッチ・アプリケーションをOracleの内部で動作するようにそのままPL/SQLに移植すると次のようなロジックになると思います。

LOOP
    FETCH CURSOR1 INTO C1_REC;
    EXIT WHEN CURSOR1%NOTFOUND;
    IF C1_REC.TYPE = 'A' THEN
        -- データAの処理
    ELSE
        -- データBの処理
    END IF;
END LOOP;

 このように入力データを1件ずつ読み取って処理するようなロジックは、大量データの処理には適しません。プログラミング言語が何であれ、このような処理ロジックで実装されたバッチ処理は最終的に性能問題に陥ることが少なくなく、今まで当然のように考えていたロジックは、大量データを扱うバッチ処理においては非常識だったのです。

 そこでループのないロジックでの実装が必要になるのですが、同一条件のデータを一括処理することで可能になります。副問い合わせやCASE式を使うことで従来はいくつかのSQL文とプログラムロジックで実現していた処理でも、1つのSQL文にすることができます。

 大量データの処理を得意とするデータベース機能により、1つのSQL文で一括処理することで効率的なI/Oとなり、さらには高性能なハードウェア、リソースをフルに活用して処理時間の短縮が期待できます。またプログラマーが自由に記述できるプログラムロジックが減ることで、より標準化しやすくメンテナンス性も向上します。

1-4-1. CASE式

 Oracle9iから利用可能な比較的新しいSQLでの条件式です。

 古くからのOracleユーザーはDECODE関数をご存知かと思いますが、置き換えることができますし、さらに今までDECODE関数ではできなかった値の置き換えもできるようになります。

DECODE(sex, 1, '男性', 2, '女性', 'その他')

 DECODE関数で上記のように記述されたSQL文は、CASE式で次のように置き換えることが可能です。

CASE sex
  WHEN 1 THEN '男性'
  WHEN 2 THEN '女性'
  ELSE 'その他'
END
もしくは
CASE WHEN sex=1 THEN '男性'
     WHEN sex=2 THEN '女性'
     ELSE 'その他'
END

 DECODE関数では値がイコールか評価するのみですが、CASE式では範囲での評価も可能です。次のようなことも1つのSQL文で記述できるようになります。

CASE WHEN score>=80 THEN '優'
     WHEN score>=60 THEN '良'
     END '可'
END

1-5. DDLの活用

 データ加工で利用できる機能がOracleデータベースにたくさんあるとしても、入力データから希望する出力データへの加工を1つのSQL文で実装するのは困難です。

 そこでDDL(Data Definition Language)を活用しましょう。

CREATE TABLE 出力テーブル AS SELECT ... FROM 入力テーブル

 このSQL文はテーブルを作成し、SELECT文で出力されるデータを格納します。この作成されたテーブルが中間テーブルとなり、複雑なデータ加工を必要とする場合でも結果セットをつないでいくことで実現できます。

 それぞれの結果セット(中間テーブル)から結果セットへのデータ加工は、データベース内で一括処理されるためスループットが向上します。

 処理のコンポーネント化を考える際に、このDDLが1つのコンポーネントになるように設計すると、汎用性、再利用性の高いコンポーネントが完成します。

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