首页 > 解决方案 > 基于慢函数创建年报物化视图

问题描述

考虑以下场景:

我有一张包含 100 万个产品 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,
             getProductMetrics(pid,mydate      AS annual_metric,
             mydate
        FROM products,mydates
   

或者它会永远?

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

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

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

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

标签: sqloracleoptimizationmaterialized-views

解决方案


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

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


推荐阅读