如何解决基于慢速功能为年度报告创建实例化视图
请考虑以下情形:
create table products (
pid number,p_description varchar2(200)
)
function gerProductMetrics(pid,date) return number
返回给定日期的给定产品指标。
每年还会根据以下查询执行年度报告:
select pid,p_description,getProductMetrics(pid,'2019-12-31') from
products
在给定年份执行该查询大约需要20-40分钟。
CREATE TABLE mydates
(
mydate date
);
INSERT INTO mydates (mydate)
VALUES (DATE '2019-12-31');
INSERT INTO mydates (mydate)
VALUES (DATE '2018-12-31');
INSERT INTO mydates (mydate)
VALUES (DATE '2017-12-31');
CREATE MATERIALIZED VIEW metrics_summary
BUILD IMMEDIATE
REFRESH FORCE ON DEMAND
AS
SELECT pid,mydate AS annual_metric,mydate
FROM products,mydates
还是会永远?
我还应该多久更新一次此MV?
每年年底都需要指标数据。
但是可以随时请求任何一年的数据。
请注意,我无法控制慢速功能-这只是给定的。 谢谢。
解决方法
首先,您没有“分组依据”查询,因此可以将其删除。
如果您需要重新计算所有年份的所有数据,则MV最有用。由于这似乎是摘要,因此无需重新处理旧数据,仅在经过某些阈值日期(如年末)时才进行更新,因此我建议将结果放在普通表中,并且仅添加与阈值日期相同的频率使用存储过程(每年一次?)发生。否则,您的MV将需要更长的时间来运行,并且每次执行都会增加新的日期,因此需要更多的系统资源。
,不创建实例化视图。这不仅仅是性能问题。这也是一个存档问题:您不希望冒历史结果可能发生变化的风险。
我的建议是创建一个带有“年份”列的表格。每年运行一次查询,并将行插入到新表中。这是结果的存档。
注意:如果由于结果可能已更改(例如,数据已以某种方式更新)而要重新计算前几年,则应将这些结果存储在单独的表中,并确定哪个版本是“正确的”版本。您可能会发现您想要一个带有“截止日期”和“运行日期”的存档表,以查看结果可能如何更改。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。