【问题标题】:creating materialized view for annual report based on slow function基于慢函数创建年报物化视图
【发布时间】:2020-10-11 20:16:48
【问题描述】:

考虑以下场景:

我有一张包含 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?

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

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

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

【问题讨论】:

  • 也许可以将getProductMetrics 功能转换为纯sql 并获得相同的数据,而无需使用该功能。我不知道,因为不清楚它的作用,但我已经看到了完全可能的情况。
  • @KoenLostrie 我知道你的意思......但遗憾的是,现在替换函数不是一个选项。

标签: sql oracle optimization materialized-views


【解决方案1】:

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

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

【讨论】:

  • 是的,您对group by 的看法是正确的——在写这个问题时一定是被冲昏了头脑……修正了它。存储过程是我的第一个想法,但我得到了一些(可能是错误的)建议使用 MV...stackoverflow.com/questions/64286481/…。我对你表达的保留意见相同......可能是我的第一个问题没有形成足够好 - 可能这就是我得到 MV 建议的原因......
  • 看看你的另一个问题,我不会创建一个临时表 - 让它成为一个永久表,就像 MV 一样。但是,如果 MV 每次都会重建您的整个结果集,只需使用存储过程每年添加新数据。也无需编写“几十个插入语句”——只需在一系列日期中循环该过程即可完成初始加载。
【解决方案2】:

不要创建实体化视图。这不仅仅是性能问题。这也是一个存档问题:您不想冒历史结果可能发生变化的风险。

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

注意:如果您想重新计算前几年,因为结果可能已经改变(比如数据以某种方式更新),那么您应该将这些结果存储在单独的表中,并确定哪个版本是“正确”的版本。您可能会发现您需要一个包含“截止日期”和“运行日期”的存档表,以查看结果可能会如何变化。

【讨论】:

    猜你喜欢
    • 2021-05-04
    • 2012-03-07
    • 1970-01-01
    • 2014-04-25
    • 2011-11-16
    • 1970-01-01
    • 2020-04-11
    • 2015-02-11
    • 1970-01-01
    相关资源
    最近更新 更多