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 的查询实际上能够使用物化视图。据 Oracle 所知,在物化视图刷新时满足条件的物化视图中的数据不再满足条件,而没有进入物化视图的数据现在仅仅因为 SYSDATE 已更改而满足条件。

于 2010-11-30T14:50:06.070 回答
0

您不需要启用查询重写。此外,鉴于您的 mview 定义,它可能无论如何都不会帮助您。

于 2010-11-30T14:40:19.030 回答