收集年度汇总数据以供以后快速访问

时间:2020-10-09 19:54:47

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

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

这些查询非常麻烦,并且需要花费大量时间(20分钟-40分钟)执行。

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

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

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

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

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

例如

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

1 个答案:

答案 0 :(得分: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
相关问题