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)
/

Enable Query Rewrite オプションが無効になっている場合、上記のクエリに対して MView が作成されます。マテリアライズド ビューの作成中に ENABLE QUERY REWRITE 句を使用する目的は何ですか。それを削除して作成できますか。コメントする必要がある場合は、MView を使用して、クエリの書き換えを有効にします。

enable query rewrite オプションの使い方を詳しく教えてください。

4

2 に答える 2

8

クエリー・リライトにより、Oracleは実表(この場合はTEST_DATE)に対するクエリーをリライトして、マテリアライズド・ビュー(この場合はTEST_SYS)を透過的に使用できます。たとえば、具体化されたビューがデータを事前に集計している場合、これは非常に便利です。トランザクション テーブルとマテリアライズド ビューがある場合

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に対するクエリが実際にマテリアライズドビューを使用できることを理解できないためです。マテリアライズド ビューがリフレッシュされたときに条件を満たしていたマテリアライズド ビュー内のデータは、もはや条件を満たしていません。

于 2010-11-30T14:50:06.070 に答える
0

クエリの書き換えを有効にする必要はありません。さらに、あなたの mview 定義を考えると、とにかくあなたを助けないでしょう。

于 2010-11-30T14:40:19.030 に答える