微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

基于慢速功能为年度报告创建实例化视图

如何解决基于慢速功能为年度报告创建实例化视图

请考虑以下情形:

我有一个表格,其中包含一百万个产品ID products

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分钟。

使用以下方法为此情况创建物化视图(MV)是正确的方法

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 举报,一经查实,本站将立刻删除。