将物质化视图与查询相结合

时间:2017-05-15 19:46:48

标签: sql oracle oracle11g

我有这个查询,它在程序内运行:

select sum(mass_mton) as CORR
        from DAY_STREAM_MASS
      where production_day between trunc(Date_Parameter, 'YEAR') 
         and LAST_DAY(date_parameter)
         and code = 'CORR'

所以它从年初开始计算(对于选定的日期参数 )到所选日期参数的月份的最后一天。 问题是它运行缓慢(我在程序中有大约15种这样的查询)。 因此,作为解决方法,我创建了materilized视图 已计算每个月的总和,但不包括上个月,我想在查询中计算的上一个月的总和,因为它在月份关闭期间由用户更新(他们需要立即查看上个月的结果)但是之前的所有内容上个月被关闭所以没人更新,所以mat视图如下所示:

create materilazed view BALANCE_YEAR
as 
  SELECT TRUNC (production_day, 'month') month,
     SUM (mass_mton) AS volume,
     'CORR' AS code
   FROM DAY_STREAM_MASS
   WHERE     code = 'CORR'
     AND production_day BETWEEN '01-Jan-2011'
     AND ADD_MONTHS (LAST_DAY (TRUNC (SYSDATE, 'month')),-2)
                GROUP BY TRUNC (production_day, 'month')

然后我将mat视图与查询结合起来计算上个月的总和:

CREATE OR REPLACE FORCE VIEW BALANCE_YEAR_FINAL
(PRODUCTION_DAY, VOLUME, CODE)
BEQUEATH DEFINER
AS

SELECT "PRODUCTION_DAY", "VOLUME", "CODE" FROM BALANCE_YEAR
UNION
  SELECT TRUNC (production_day, 'month') month,
     SUM (mass_mton) AS volume,
     'CORR' AS code
    FROM DAY_STREAM_MASS
   WHERE     code = 'CORR'
     AND production_day BETWEEN ADD_MONTHS (TRUNC (SYSDATE, 'month'), -1)
     AND ADD_MONTHS (LAST_DAY (TRUNC (SYSDATE, 'month')),-1)
GROUP BY TRUNC (production_day, 'month') 

现在,最后我把它放到初始查询中,但是从上一步创建的视图中选择但是在我的初始查询中它仍然运行得很慢:

select sum(mass_mton) as CORR
    from BALANCE_YEAR_FINAL
  where production_day between trunc(Date_Parameter, 'YEAR') 
     and LAST_DAY(date_parameter)
     and code = 'CORR'

我认为这里的问题与视图有关,所以我可能需要避免使用视图并直接使用mat视图进行初始查询。有没有什么方法可以将mat视图直接与初始查询结合使用,同时使用mat视图中的数据和上个月的总和,或者你可以在这种情况下做一些不同的事情?

提前感谢!!

0 个答案:

没有答案