基于慢函数创建年报物化视图
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,以查看结果可能发生的变化。
考虑以下场景:
我有一个 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,以查看结果可能发生的变化。