gpt4 book ai didi

oracle - MView "enable query rewrite"使用情况

转载 作者:行者123 更新时间:2023-12-01 10:12:01 48 4
gpt4 key购买 nike

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,那么在创建物化 View 时使用 ENABLE QUERY REWRITE 子句的目的是什么,我们可以删除它并创建它,我们是否必须妥协如果我们必须评论启用查询重写,则 MView 的性能。

请详细解释一下启用查询重写选项的使用。

最佳答案

查询重写允许 Oracle 重写对基表(在本例中为 TEST_DATE)的查询,以透明地使用物化 View (在本例中为 TEST_SYS)。例如,当您的物化 View 预聚合数据时,这非常有用。如果我有一个事务表和一个物化 View

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

使用物化 View 而不是点击基表。如果您创建了适当的维度对象,则可以进行类似的查询

SELECT store_id,
trunc(transaction_day,'MM'),
SUM(transaction_amount) monthly_transaction_amount
FROM transactions
GROUP BY store_id, trunc(transaction_day,'MM')

也可以重写以使用物化 View 而不是基表。

如果未启用查询重写,则只有在显式查询实体化 View 而不是查询基表时,才能看到使用实体化 View 的性能优势。这通常需要更多的开发工作,并限制了 DBA 在未来通过微调物化 View 来调整应用程序的能力。

在您的情况下,您的 WHERE 子句中存在 SYSDATE 将阻止查询重写,因为 Oracle 无法确定针对 TEST_DATE 的查询实际上能够使用物化 View 。据 Oracle 所知,在物化 View 刷新时满足条件的物化 View 中的数据不再满足条件,而没有进入物化 View 的数据现在仅仅因为 SYSDATE 已更改而满足条件。

关于oracle - MView "enable query rewrite"使用情况,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4314435/

48 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com