外部表によるビジネス・インテリジェンス処理の強化
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);
|