基于慢函数创建年报物化视图

creating materialized view for annual report based on slow function

考虑以下场景:

我有一个 table 有 100 万个产品 ID products :

create table products (
pid number,
p_description varchar2(200)
)

还有一个比较慢的功能

function gerProductMetrics(pid,date) return number

给定日期给定产品的returns一些指标。

每年还有一份年度报告基于以下查询执行:

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,
             getProductMetrics(pid,mydate      AS annual_metric,
             mydate
        FROM products,mydates
   

还是会花很长时间?

此外,我将如何以及多久更新一次此 MV?

每年年底都需要指标数据。

但是可以随时请求任何年份的数据。

请注意,我无法控制慢速功能 - 它只是给定的。 谢谢。

首先,您没有“分组依据”查询,因此您可以删除它。

如果您需要重新计算所有年份的 所有 数据,MV 将是最有用的。由于这似乎是一个摘要,不需要重新处理旧数据,仅在超过某些阈值日期(如年底)时更新,我建议将结果放在正常的 table 中,并且只经常添加更新当您的阈值日期发生时(每年?)使用存储过程。否则,您的 MV 将花费更长的时间 运行,并且每次执行添加新日期时都需要更多的系统资源。

不创建物化视图。这不仅仅是性能问题。这也是一个归档问题:您不想 运行 历史结果可能发生变化的风险。

我的建议是创建一个带有“年份”列的 table。 运行 每年查询一次并将行插入新的 table。这是结果的存档。

注意:如果你想重新计算前几年因为结果可能已经改变(比如数据以某种方式更新),那么你应该将这些结果存储在一个单独的 table 中并决定哪个版本是“对”的版本。您可能会发现您想要一个包含“as-of”日期和“run-date”的存档 table,以查看结果可能发生的变化。