Oracle Database 2日でデータ・ウェアハウス・ガイド 11g リリース1(11.1) E05764-01 |
|
この章の内容は次のとおりです。
データ・ウェアハウスを定期的に更新し、現在の情報を導出します。データの更新プロセスは、リフレッシュ処理と呼ばれます。
抽出、変換およびロード(ETL)は、スケジュールに基づいて実行され、元のソース・システムへの変更が反映されます。この手順の間、新規の更新されたデータを本番データのウェアハウス・スキーマに物理的に挿入し、ユーザーがこのデータを使用できるようにするために、他のすべての必要な手順(索引の作成、制限の検証、バックアップ・コピーの作成)に従います。このデータをすべてデータ・ウェアハウスにロードすると、マテリアライズド・ビューを更新して最新のデータを反映する必要があります。
データ・ウェアハウスのパーティショニング・スキームは、データ・ウェアハウスのロード・プロセスでの操作のリフレッシュの効率性を決定する際に重要です。ロード・プロセスは、データ・ウェアハウス表のパーティショニング・スキームの選択時に考慮されます。
多くのデータ・ウェアハウスでは、定期的に新規データがロードされます。たとえば、日、週または月ごとに新規データがデータ・ウェアハウスに取り込まれます。週末または月末にロードされたデータは通常、その週またはその月のトランザクションに対応します。この一般的なシナリオでは、データ・ウェアハウスは時間ごとにロードされます。ここで、データ・ウェアハウス表をデータ列上でパーティション化することをお薦めします。データ・ウェアハウスの例として、新規データが毎月、売上表にロードされると想定します。さらに、sales
表は毎月、パーティション化されるものとします。これらの手順では、ロード・プロセスによる新しい月(2006年第1四半期)のsales
表へのデータの追加処理方法を示します。
多くの問合せでは、日付で問合せが制限されているproducts
、customers
およびsales
表の一部の列が要求されます。マテリアライズド・ビューを利用すると、3つの表に対する問合せの大部分が高速化されます。マテリアライズド・ビューが作成される事前作成表を使用して、sales
表のパーティション計画を持つ動機のマテリアライズド・ビューのパーティション計画を選択します。
次に、マテリアライズド・ビューのリフレッシュに関する例を示します。ここでは、パーティション交換ロード操作を使用します。この例はsh
スキーマのsales
表に基づいています。
CREATE TABLE sales_prod_cust_mv ( time_id DATE , prod_id NUMBER , prod_name VARCHAR2(50) , cust_id NUMBER , cust_first_name VARCHAR2(20) , cust_last_name VARCHAR2(40) , amount_sold NUMBER , quantity_sold NUMBER ) PARTITION BY RANGE (time_id) ( PARTITION p1999 VALUES LESS THAN (TO_DATE('01-JAN-2000','DD-MON-YYYY')) , PARTITION p2000 VALUES LESS THAN (TO_DATE('01-JAN-2001','DD-MON-YYYY')) , PARTITION p2001h1 VALUES LESS THAN (TO_DATE('01-JUL-2001','DD-MON-YYYY')) , PARTITION p2001h2 VALUES LESS THAN (TO_DATE('01-JAN-2002','DD-MON-YYYY')) , PARTITION p2001q1 VALUES LESS THAN (TO_DATE('01-APR-2002','DD-MON-YYYY')) , PARTITION p2002q2 VALUES LESS THAN (TO_DATE('01-JUL-2002','DD-MON-YYYY')) , PARTITION p2002q3 VALUES LESS THAN (TO_DATE('01-OCT-2002','DD-MON-YYYY')) , PARTITION p2002q4 VALUES LESS THAN (TO_DATE('01-JAN-2003','DD-MON-YYYY')) , PARTITION p2003q1 VALUES LESS THAN (TO_DATE('01-APR-2003','DD-MON-YYYY')) , PARTITION p2003q2 VALUES LESS THAN (TO_DATE('01-JUL-2003','DD-MON-YYYY')) , PARTITION p2003q3 VALUES LESS THAN (TO_DATE('01-OCT-2003','DD-MON-YYYY')) , PARTITION p2003q4 VALUES LESS THAN (TO_DATE('01-JAN-2004','DD-MON-YYYY')) , PARTITION p2004q1 VALUES LESS THAN (TO_DATE('01-APR-2004','DD-MON-YYYY')) , PARTITION p2004q2 VALUES LESS THAN (TO_DATE('01-JUL-2004','DD-MON-YYYY')) , PARTITION p2004q3 VALUES LESS THAN (TO_DATE('01-OCT-2004','DD-MON-YYYY')) , PARTITION p2004q4 VALUES LESS THAN (TO_DATE('01-JAN-2005','DD-MON-YYYY')) , PARTITION p2005q1 VALUES LESS THAN (TO_DATE('01-APR-2005','DD-MON-YYYY')) , PARTITION p2005q2 VALUES LESS THAN (TO_DATE('01-JUL-2005','DD-MON-YYYY')) , PARTITION p2005q3 VALUES LESS THAN (TO_DATE('01-OCT-2005','DD-MON-YYYY')) , PARTITION p2005q4 VALUES LESS THAN (TO_DATE('01-JAN-2006','DD-MON-YYYY')) , PARTITION p2006q1 VALUES LESS THAN (TO_DATE('01-APR-2006','DD-MON-YYYY')) ) PARALLEL COMPRESS;
sales
表の初期表をロードします。
ALTER SESSION ENABLE PARALLEL DML; INSERT /*+ PARALLEL smv */ INTO sales_prod_cust_mv smv SELECT /*+ PARALLEL s PARALLEL c */ s.time_id , s.prod_id , p.prod_name , s.cust_id , cust_first_name , c.cust_last_name , SUM(s.amount_sold) , SUM(s.quantity_sold) FROM sales s , products p , customers c WHERE s.cust_id = c.cust_id AND s.prod_id = p.prod_id GROUP BY s.time_id , s.prod_id , p.prod_name , s.cust_id , c.cust_first_name , c.cust_last_name; COMMIT;
CREATE MATERIALIZED VIEW sales_prod_cust_mv ON PREBUILT TABLE ENABLE QUERY REWRITE AS SELECT s.time_id , s.prod_id , p.prod_name , s.cust_id , c.cust_first_name , c.cust_last_name , SUM(s.amount_sold) amount_sold , SUM(s.quantity_sold) quantity_sold FROM sales s , products p , customers c WHERE s.cust_id = c.cust_id AND s.prod_id = p.prod_id GROUP BY s.time_id , s.prod_id , p.prod_name , s.cust_id , c.cust_first_name , c.cust_last_name;
CREATE TABLE sales_q1_2006 PARALLEL COMPRESS AS SELECT * FROM sales WHERE 0 = 1; /* This would be the regular ETL job */ ALTER SESSION ENABLE PARALLEL DML; INSERT /* PARALLEL qs */ INTO sales_q1_2006 qs SELECT /* PARALLEL s */ prod_id , cust_id , add_months(time_id,3) , channel_id , promo_id , quantity_sold , amount_sold FROM sales PARTITION(sales_q4_2005) s; COMMIT; CREATE BITMAP INDEX bmp_indx_prod_id ON sales_q1_2006 (prod_id); CREATE BITMAP INDEX bmp_indx_cust_id ON sales_q1_2006 (cust_id); CREATE BITMAP INDEX bmp_indx_time_id ON sales_q1_2006 (time_id); CREATE BITMAP INDEX bmp_indx_channel_id ON sales_q1_2006 (channel_id); CREATE BITMAP INDEX bmp_indx_promo_id ON sales_q1_2006 (promo_id); ALTER TABLE sales_q1_2006 ADD CONSTRAINT sales_q_prod_fk FOREIGN KEY (prod_id) REFERENCES products(prod_id) ENABLE NOVALIDATE; ALTER TABLE sales_q1_2006 ADD CONSTRAINT sales_q_cust_fk FOREIGN KEY (cust_id) REFERENCES customers(cust_id) ENABLE NOVALIDATE; ALTER TABLE sales_q1_2006 ADD CONSTRAINT sales_q_time_fk FOREIGN KEY (time_id) REFERENCES times(time_id) ENABLE NOVALIDATE; ALTER table sales_q1_2006 ADD CONSTRAINT sales_q_channel_fk FOREIGN KEY (channel_id) REFERENCES channels(channel_id) ENABLE NOVALIDATE; ALTER table sales_q1_2006 ADD CONSTRAINT sales_q_promo_fk FOREIGN KEY (promo_id) REFERENCES promotions(promo_id) ENABLE NOVALIDATE; BEGIN DBMS_STATS.GATHER_TABLE_STATS('SH','SALES_Q1_2006'); END; /
CREATE TABLE sales_mv_q1_2006 PARALLEL COMPRESS AS SELECT * FROM sales_prod_cust_mv WHERE 1 = 0; ALTER SESSION ENABLE PARALLEL DML; INSERT /*+ PARALLEL smv */ INTO sales_mv_q1_2006 smv SELECT /*+ PARALLEL s PARALLEL c */ s.time_id , s.prod_id , p.prod_name , s.cust_id , cust_first_name , c.cust_last_name , SUM(s.amount_sold) , SUM(s.quantity_sold) FROM sales_q1_2006 s , products p , customers c WHERE s.cust_id = c.cust_id AND s.prod_id = p.prod_id GROUP BY s.time_id , s.prod_id , p.prod_name , s.cust_id , c.cust_first_name , c.cust_last_name; COMMIT;
BEGIN DBMS_STATS.GATHER_TABLE_STATS('SH','SALES_MV_Q1_2006'); END;
ALTER TABLE sales EXCHANGE PARTITION sales_q1_2006 WITH TABLE sales_q1_2006 INCLUDING INDEXES WITHOUT VALIDATION; ALTER TABLE sales_prod_cust_mv EXCHANGE PARTITION p2006q1 WITH TABLE sales_mv_q1_2006 INCLUDING INDEXES WITHOUT VALIDATION;
ALTER MATERIALIZED VIEW sales_prod_cust_mv CONSIDER FRESH;
このシナリオでは、事前作成表を使用し、この制約はRELY
制約ではないため、問合せのリライト機能はquery_rewrite_integrity
をSTALE_TOLERATED
に設定した場合にのみ有効です。
データを削除したりアーカイブする際にローリング・ウィンドウを使用すると特に効果的です。たとえば、最新の36か月の売上データをデータ・ウェアハウスに格納する場合にローリング・ウィンドウを使用します。新規パーティションは、新しい月のsales
表にそれぞれ追加され、古いパーティションはsales
表から削除される場合があります。この方法では、ウェアハウスに常に36か月分のデータが保持されます。
次にsh
スキーマのsales
表のローリング・ウィンドウの例を示します。
|
![]() Copyright © 2007 Oracle Corporation. All Rights Reserved. |
|