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,然后在创建物化视图时使用ENABLE QUERY REWRITE子句的目的是什么,我们是否可以删除它并创建它,我们是否必须妥协如果我们必须注释启用查询重写,MView的性能。
请详细解释使用enable query rewrite选项。
答案 0 :(得分:7)
查询重写允许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的查询实际上是否能够使用实例化视图。对于所有Oracle都知道,物化视图中的数据在刷新物化视图时满足条件不再满足条件,并且数据未进入物化视图现在仅仅因为SYSDATE已更改而满足条件。
答案 1 :(得分:0)
您无需启用查询重写。此外,鉴于你的mview定义,无论如何它可能都不会让你理解。