Oracle物化视图:分区策略

时间:2017-10-18 09:29:19

标签: oracle data-warehouse partitioning materialized-views

我有一个摘要物化视图,按年份(字符),月份(字符)和其他3个维度组织,然后是许多度量。我的数据从2013年到现在并且持续增加。

由于基础事实表很大(每年500 + M行增加100 + M),我正在考虑对表和MV进行分区,以便刷新MV中的最后12个月。

经过多次阅读后,我应该按范围(每月)对事实表进行分区,并按月对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 个答案:

答案 0 :(得分:1)

为什么不按月进行简单分区?按月分区和按分区分区没有任何意义。删除较旧的分区是不可能的,通常维护是非常困难的。

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

然后为你MView:

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

这也可以避免任何分区维护。

关于性能,它在很大程度上取决于您在其上运行的主要查询。在分区表上比在非分区表上具有更差的性能相当容易。如果您的主要查询没有选择某些日期范围,则日期分区是矛盾的(就性能而言)。