2010-11-30 2 views
3
CREATE TABLE TEST_DATE(COL1 VARCHAR2(20),COL2 NUMBER,COL3_DATE DATE,COL4_DATE DATE) 
/ 

create materialized view TEST_SYS 
REFRESH FORCE ON DEMAND 
ENABLE QUERY REWRITE --- ???? 
AS 
SELECT COL1,COL2 
FROM TEST_date 
WHERE TRUNC(SYSDATE) BETWEEN TRUNC(COL3_DATE) AND TRUNC(COL4_DATE) 
/

クエリー・リライトオプションを有効にした場合は無効になり、MVIEWは、上記のクエリのために作成取得された後、作成中のQUERY REWRITE句をENABLE持つことの目的は、マテ​​リアライズド・ビューをされているもの、我々はそれを削除することができますし、それを作成し、クエリーの書き換えをコメントする必要がある場合は、MViewのパフォーマンスを妥協する必要があります。MVIEW「クエリー・リライトを有効にする」の使用

私は、クエリー・リライトの有効化オプションの使用について詳しく説明してください。

答えて

7

クエリー・リライトでは、マテリアライズド・ビュー(この場合はTEST_SYS)を透過的に使用するために、Oracleはベース表(この場合はTEST_DATE)に対して問合せを書き直すことができます。これは、マテリアライズド・ビューが事前集計データの場合などに非常に便利です。私は、トランザクションテーブルとマテリアライズド・ビュー

CREATE MATERIALIZED VIEW mv_transaction_daily 
    REFRESH FORCE ON DEMAND 
    ENABLE QUERY REWRITE 
AS 
SELECT store_id, 
     transaction_day, 
     SUM(transaction_amount) total_transaction_amount 
    FROM transactions 
GROUP BY store_id, transaction_day 

を持っている場合、Oracleは、ベーステーブルを打つのではなく、マテリアライズド・ビューを使用するように

SELECT store_id, 
     transaction_day, 
     SUM(transaction_amount) total_transaction_amount 
    FROM transactions 
GROUP BY store_id, transaction_day 

のようなクエリを変換することができます。あなたは適切なディメンション・オブジェクトが作成されている場合と、あなたはまた、ベーステーブルではなく、マテリアライズド・ビューを使用するように書き換えることができ

SELECT store_id, 
     trunc(transaction_day,'MM'), 
     SUM(transaction_amount) monthly_transaction_amount 
    FROM transactions 
GROUP BY store_id, trunc(transaction_day,'MM') 

のようなクエリを持つことができます。

クエリー・リライトが有効になっていないと、実表を問い合せるのではなく、マテリアライズド・ビューを明示的に問い合せた場合、マテリアライズド・ビューを使用することによるパフォーマンス上の利点があります。これは一般的に、より多くの開発努力を必要とし、将来のマテリアライズド・ビューを微調整することによってDBAがアプリケーションをチューニングする能力を制限します。

場合によっては、WHERE句にSYSDATEが存在すると、OracleはTEST_DATEに対する問合せが実際にマテリアライズド・ビューを使用できることがわからないため、クエリー・リライトを回避します。すべてのOracleでは、マテリアライズド・ビューがリフレッシュされたときの条件を満たすマテリアライズド・ビュー内のデータは、条件を満たしなくなり、マテリアライズド・ビューに入れなかったデータは、SYSDATEが変更されたために条件を満たすようになりました。

0

クエリー・リライトを有効にする必要はありません。さらに、あなたのmviewの定義を考えれば、とにかくあなたを傷つけることはないでしょう。

関連する問題