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

问题描述

请考虑以下情形:

我有一个表格,其中包含一百万个产品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将需要更长的时间来运行,并且每次执行都会增加新的日期,因此需要更多的系统资源。

,

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

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

注意:如果由于结果可能已更改(例如,数据已以某种方式更新)而要重新计算前几年,则应将这些结果存储在单独的表中,并确定哪个版本是“正确的”版本。您可能会发现您想要一个带有“截止日期”和“运行日期”的存档表,以查看结果可能如何更改。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...