【问题标题】:collecting annual aggregated data for later quick access收集年度汇总数据以供以后快速访问
【发布时间】:2021-01-24 21:57:41
【问题描述】:

我有许多 sql 查询,它们以year 为参数并生成给定年份的各种年度报告。

这些查询非常繁琐,需要相当长的时间来执行(20 分钟 - 40 分钟)。

为了让我的用户能够在需要时查看年度报告,我正在考虑预先执行这些查询并存储结果以供以后使用。

一种解决方案是安排这些查询的执行并将结果插入到一些临时表中。

但我正在寻找一种更聪明的方法,这种方法不涉及为所有这些查询编写数十个执行立即语句或自定义插入。

任何想法将不胜感激。另外我不知道是否可以为此使用物化视图。

预期结果将是带有年份列的表格或视图,以便用户可以对任何年份执行快速搜索。

例如

product_id |annual_sales|max_price|min_price|year
124|1200,56|80|50|2019
124|1400,00|85|55|2020

【问题讨论】:

  • 除了说“是的,物化视图通常是要使用的技术”之外,我不太确定您要寻找什么样的答案。您是否尝试过使用物化视图?您在实施它们时遇到问题吗?让查询重写工作?还有什么?
  • @JustinCave 首先,我不确定 MV 是否是正确的选择 - 你已经介绍过了。我对 MV 的一个担忧是(如果我理解正确的话)我应该通过删除 where myyear=year 子句并按年份分组来重写我的查询。但是一年的结果需要 40 分钟才能完成...不会是查询组有问题的缓慢...而且理想情况下我需要每年收集一次过去几年的数据..而不是重新计算每年已经计算过了……我可以用物化视图来做吗?
  • @JustinCave 你能看看我的新问题,并告诉我你对 MV 的建议是否仍然有效? stackoverflow.com/questions/64302432/… 谢谢。

标签: sql oracle scheduled-tasks data-warehouse materialized-views


【解决方案1】:

物化视图将是您想要做的事情的绝佳选择。通过这种方式,您可以为视图编写一次查询,然后让物化视图中的数据根据​​需要随时刷新。您的工作可以是每晚、周末或您选择的任何频率刷新一次数据。

创建物化视图后,如果愿意,您还可以在物化视图之上添加索引以帮助提高查询性能。

下面是一个关于如何创建物化视图的简单示例。

CREATE TABLE sale
(
    product_id     NUMBER,
    sale_date      DATE,
    sale_amount    NUMBER
);

INSERT INTO sale (product_id, sale_date, sale_amount)
     VALUES (124, DATE '2019-02-01', 40.25);

INSERT INTO sale (product_id, sale_date, sale_amount)
     VALUES (124, DATE '2019-02-01', 80.99);

INSERT INTO sale (product_id, sale_date, sale_amount)
     VALUES (124, DATE '2020-02-01', 30.50);

INSERT INTO sale (product_id, sale_date, sale_amount)
     VALUES (124, DATE '2020-02-01', 46.75);

CREATE MATERIALIZED VIEW sales_summary
BUILD IMMEDIATE
REFRESH FORCE ON DEMAND
AS
      SELECT product_id,
             SUM (sale_amount)                 AS annual_sales,
             MAX (sale_amount)                 AS max_price,
             MIN (sale_amount)                 AS min_price,
             EXTRACT (YEAR FROM sale_date)     AS year
        FROM sale
    GROUP BY product_id, EXTRACT (YEAR FROM sale_date);

结果

select * from sales_summary;

   PRODUCT_ID    ANNUAL_SALES    MAX_PRICE    MIN_PRICE    YEAR
_____________ _______________ ____________ ____________ _______
          124          121.24        80.99        40.25    2019
          124           77.25        46.75         30.5    2020

【讨论】:

  • 我在这个用例中看到的 MV 问题是输出数据仅每年汇总一次,似乎不需要重新计算过去几年。当您需要重新计算 整个 结果集时,MV 最有意义。鉴于数据仅每年计算一次,使用带有 MV 日志的快速刷新 MV 似乎也不实用。
猜你喜欢
  • 2011-12-05
  • 1970-01-01
  • 2014-10-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-04
  • 1970-01-01
相关资源
最近更新 更多