2017-10-18 171 views
0

我有一个按年(char),月(char)和其他3个维度组织的摘要物化视图,后面跟着许多度量。我的数据从2013年到现在的时间和连续增量。由于潜在的事实表是巨大的(500 + M行每年增加100 + M),我正在考虑对表和MV进行分区,以便刷新MV中的最后12个月。Oracle物化视图:分区策略

经过多次阅读后,我应该按范围(每个月)对事实表进行分区,按月划分MV,按年划分子划分。

我知道分区策略对于性能至关重要,所以我问是否有人有更好的解决方案,或者我制定的解决方案是最优解决方案。

谢谢!的MV分区代码

例子:

CREATE MATERIALIZED VIEW my_mv 
    PARTITION BY LIST (month) SUBPARTITION BY LIST (year) 
     (PARTITION p01 VALUES ('01') 
      (SUBPARTITION p_0117 VALUES ('2017') 
      , SUBPARTITION p_0116 VALUES ('2016') 
      , SUBPARTITION p_0115 VALUES ('2015') 
      , SUBPARTITION p_0114 VALUES ('2014') 
      , SUBPARTITION p_0113 VALUES ('2013') 
     ) 
     , PARTITION p02 VALUES ('02') 
      (SUBPARTITION p_0217 VALUES ('2017') 
      , SUBPARTITION p_0216 VALUES ('2016') 
      , SUBPARTITION p_0215 VALUES ('2015') 
      , SUBPARTITION p_0214 VALUES ('2014') 
      , SUBPARTITION p_0213 VALUES ('2013') 
     ) 

     ... 

     , PARTITION p12 VALUES ('12') 
      (SUBPARTITION p_1217 VALUES ('2017') 
      , SUBPARTITION p_1216 VALUES ('2016') 
      , SUBPARTITION p_1215 VALUES ('2015') 
      , SUBPARTITION p_1214 VALUES ('2014') 
      , SUBPARTITION p_1213 VALUES ('2013') 
     ) 
     ) 
AS 
SELECT 
    ... 
FROM 
    ... 
; 

回答

1

何不个月制作简单分区?按月份和按年份划分没有任何意义。丢弃较旧的分区是不可能的,一般而言,维护是相当困难的。

SELECT 
... 
TO_TIMESTAMP(year||month, 'YYYYMM') AS PARTITION_KEY, 
... 

,然后你MVIEW:

PARTITION BY RANGE (PARTITION_KEY) INTERVAL (INTERVAL '1' MONTH) 

这也从任何分区保养为您节省。

关于性能,它强烈依赖于您在其上运行的主要查询。分区表上的性能比非分区表上的表现要差一些。如果您的主要查询不选择某些日期范围,那么在日期分区是矛盾的(就性能而言)。

+0

感谢您的回答!用你提出的解决方案是否可以刷新MV的最后12个月?因为我没有看到使用范围技术的任何分区名称。如果有可能你能提供一个代码草图来做到这一点?再次感谢你! –

+0

当您在[DBMS_MVIEW.REFRESH()](https://docs.oracle.com/cd/B28359_01/appdev.111/b28419/d_mview.htm#i997194)处使用method =>'P''时,Oracle刷新只有自上次刷新后发生更改的分区 - 实际上应该是上个月的分区(取决于您的分区间隔)。一般来说,你可以通过名字来寻址分区,例如, “PARTITION P_201707”或值,例如'分区为(TIMESTAMP'2017-07-01 00:00:00')' –