sql - 基于慢函数创建年报物化视图
问题描述
考虑以下场景:
我有一张包含 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?
每年年底都需要指标数据。
但是可以随时请求任何年份的数据。
请注意,我无法控制慢速功能 - 这只是给定的。谢谢。
解决方案
首先,您没有“分组依据”查询,因此您可以删除它。
如果您需要重新计算所有年份的所有数据,则 MV 将是最有用的。由于这似乎是一个摘要,无需重新处理旧数据,仅在通过某些阈值日期(如年底)时更新,我建议将结果放在普通表中,并且只添加与阈值日期一样频繁的更新使用存储过程发生(每年?)。否则,您的 MV 将需要更长的时间来运行,并且每次执行添加新日期时都需要更多的系统资源。
推荐阅读
- javascript - 如何仅从返回的对象 vuejs 中获取 html
- docker - Nginx 入口控制器日志不断告诉我我的 pod 信息有误
- javascript - 如何在 Express 上挂钩进程退出事件?
- notifications - 推送通知按钮未显示在 Microsoft 应用中心
- maven - leiningen 项目中的“找不到工件 org.openjfx”
- model - 如何在 PyTorch 中加载模型而不重新定义模型?
- python - Tensor._shape 是私有的,请改用 Tensor.shape
- javascript - gRPC 服务器端流式传输:如何无限期地继续流式传输?
- flutter - 如何使用颤振应用程序从 mongodb 访问数据
- python - Python 3.8.0 奇怪的打印错误