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