首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于慢函数创建年度报告物化视图

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

Stack Overflow用户
提问于 2020-10-11 09:21:39
回答 2查看 187关注 0票数 0

考虑以下情况:

我有一个包含100万个产品ids的表,products

代码语言:javascript
复制
create table products (
pid number,
p_description varchar2(200)
)

还有一个相对缓慢的函数。

function gerProductMetrics(pid,date) return number

它在给定日期返回给定产品的某个度量。

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

代码语言:javascript
复制
select pid,p_description,getProductMetrics(pid,'2019-12-31') from
products

在给定的一年中,执行该查询大约需要20-40分钟。

使用以下方法为此场景创建物化视图(MV)是否正确

代码语言:javascript
复制
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?

每年年底都需要度量数据。

但任何一年的数据都可以在任何时候要求。

注意,我无法控制慢函数--这只是一个给定的函数。谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-10-11 10:57:58

首先,您没有"group“查询,因此可以删除该查询。

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

票数 1
EN

Stack Overflow用户

发布于 2020-10-11 12:16:48

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

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64302432

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档