クエリー・リライトでは、マテリアライズド・ビュー(この場合は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が変更されたために条件を満たすようになりました。