外部表によるビジネス・インテリジェンス処理の強化

Oracle9i では、データ・ウェアハウスおよびビジネス・インテリジェンス処理の拡張性と効率を向上させるETL(抽出、変換、ロード)機能が強化・拡張されています。

その最も画期的なETL機能の1つが、外部表機能です。 外部表機能を使用すると、データベース内にあるリレーショナル表とまったく同じようにデータベース外にあるフラット・ファイルにアクセスすることができます。 フラット・ファイル・データは、標準SQLを使用して問い合せたり他の表に結合できます。 データ・アクセスは、シリアルでも、スケーラビリティを最大限にするためにパラレルでも構いません。 ユーザーの視点から見ると、外部表と一般の表の主な違いは、外部表は読取り専用であるということです。

外部表の価値を理解するためには、データ・ウェアハウスには常に外部データ・ソースからのデータが含まれていることを考えてみてください。
たとえば、データ・ウェアハウスにOLTPシステムから抽出されたデータ、またはサード・パーティのデータ・プロバイダから購入したデータが含まれているとします。 外部データ・ソースから新しいデータをデータ・ウェアハウスに追加する際には、データを変換する必要があります。
変換タスクには、複雑なフィルタ処理、すでにウェアハウスに存在するデータに対する新しいデータの検証、および詳細レベルと集計レベルの両方におけるデータの挿入などが含まれます。
Oracle9i 以前は、Oracle内で複雑な変換を実行するためには、次の2つの戦略のいずれかを用いて外部データを変換する必要がありました。
  • データをOracleにロードして、ステージング表に格納する。 変換が終了したら、表を削除できます。 このアプローチでは、すでにディスクで使用可能になっているデータに対してディスク領域、管理リソース、および処理時間を費やしていました。

  • データベース外のフラット・ファイルの外部データを変換する。 変換のなかには、データ・ウェアハウスからのデータを必要とするものもあるため、このプロセスではフラット・ファイルの処理だけでなく、データベースへのアクセスも必要になります。 変換が完了すると、変換されたデータはデータ・ウェアハウスにロードされます。 このアプローチでは、冗長データの格納と処理時間も必要です。
Oracle9i の外部表は、これらのアプローチに固有の問題を回避します。 外部表は、外部データのロードと変換のための新しいモデルを提供します。 データを外部で変換する必要はなくなり、ステージング表に格納する必要もなくなります。 そのかわりに、外部データは仮想表としてデータベースに表され、データベース・エンジンでデータ処理すべてを実行できるようになります。
この外部データ・アクセスと変換フェーズのシームレスな統合は、一般に「パイプライン」と呼ばれます。 パイプライン処理では、データ・ストリームの中断がないため、すべてのETLプロセスにおけるパフォーマンスが向上します。


外部表は、CREATE TABLE文を使用してOracleに定義されます。 下の例は、「products_ext」という外部表を定義しています。
この表は、「new_prod1.txt」および「new_prod2.txt」というOracle外部にある2つのフラット・ファイルに基づいています。

CREATE TABLE products_ext
(prod_id NUMBER, prod_name VARCHAR2(50), prod_desc VARCHAR2(4000),
 prod_category VARCHAR2(50), prod_category_desc VARCHAR2(4000),
 list_price NUMBER(6,2), min_price NUMBER(6,2),
 last_updated DATE)
ORGANIZATION EXTERNAL
(
 TYPE oracle_loader
 DEFAULT DIRECTORY stage_dir
 ACCESS PARAMETERS
 ( RECORDS DELIMITED BY NEWLINE
  BADFILE bad_dir:'bad_products_ext'
  LOGFILE log_dir:'log_products_ext'
  FIELDS TERMINATED BY ','
  MISSING FIELD VALUES ARE NULL
  (prod_id, prod_name, prod_desc, prod_category,
  prod_category_desc, price, price_delta,
  last_updated char date_format date mask "dd-mon-yyyy")
  )
 LOCATION ('new_prod1.txt','new_prod2.txt')
 )
 PARALLEL 5
 REJECT LIMIT UNLIMITED;

この外部表のアクセスは、PARALLEL 5として定義されます。 外部ファイルへのアクセスは、ファイルの数に関わらず透過的にパラレル化されます(ファイル内パラレル化)。 外部表を介して実現可能なパラレル化により、ファイルを1つずつ処理するシリアル処理と比較してパフォーマンスが飛躍的に向上します。

上で定義した外部表を、SQLを使用して一般の表と同じように直接使用できるようになりました。 たとえば、外部データを使用して、データベース内の既存製品情報と過去24時間内の変更を同期化することができます。

MERGE INTO products d
USING (SELECT * FROM products_ext
  WHERE last_updated > SYSDATE - 1) s
ON (d.prod_id=s.prod_id)
WHEN MATCHED THEN
  UPDATE
  SET d.prod_list_price = s.list_price,
  d.prod_min_price = s.min_price
WHEN NOT MATCHED THEN
  INSERT (prod_id, prod_name, prod_desc, prod_category,
    prod_category_desc, prod_list_price, prod_min_price)
  VALUES (s.prod_id, s.prod_name, s.prod_desc, s.prod_category,
    s.prod_category_desc, s.list_price, s.min_price);
 
この文は、過去24時間に変更された行を処理し、MERGEコマンドで直接これらの行を使用します。 これにより、処理されるデータ量が減少するだけでなく、アクセスと変換処理を結合することによって中間ステージングを回避します。 外部表には任意のSQL問合せを実行できるため、外部表データをデータのロードよりもはるかに複雑な方法で変換することができます。

外部表は、データベース内部から直接外部データにアクセスして処理する、まったく新しい方法を提供します。 外部表は、外部ファイルを標準表として扱うことによってデータのアクセスと変換を簡略化します。 パイプラインとパラレル化により、外部表はETLの全体パフォーマンスを大幅に改善します。
外部表は、Oracle9i の新しいETL機能の一例に過ぎません。 新しいETL機能の完全なセットにより、すべてのETLタスクをOracleデータベース内で処理するための強力なフレームワークが構築されます。

 Oracle9i Database 技術資料 - Business Intelligence (データ・ウェアハウス) - Oracle9i が実現するE-Business: ビジネス・インテリジェンス
 Oracle9i Database 技術資料 - Business Intelligence (データ・ウェアハウス) - Oracle9i でのETL処理
 Oracle9i Database マニュアル(ドキュメント) - パフォーマンス&レプリケーション - Oracle9iデータ・ウェアハウス・ガイド - 第13章 ロードおよび変換

Oracle9i Database Daily Feature
 アーカイブ