【问题标题】:Oracle Materialized views: partition strategyOracle 物化视图:分区策略
【发布时间】:2018-03-30 03:15:25
【问题描述】:

我有一个按年(char)、月(char)和其他 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
   ...
;

【问题讨论】:

    标签: oracle data-warehouse partitioning materialized-views


    【解决方案1】:

    为什么不按月做简单的分区呢?按月分区和按年分区没有任何意义。删除旧分区是不可能的,一般来说维护会很困难。

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

    然后为你 MView:

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

    这也使您免于任何分区维护。

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

    【讨论】:

    • 感谢您的回答!使用您建议的解决方案是否可以仅刷新 MV 的最后 12 个月?因为我没有看到使用范围技术的任何分区名称。如果可能的话,你能提供一个代码草图吗?再次感谢您!
    • 当您在DBMS_MVIEW.REFRESH() 使用method => 'P' 时,Oracle 仅刷新自上次刷新以来已更改的分区——实际上应该是上个月的分区(取决于您的分区间隔)。通常,您可以通过名称来寻址分区,例如PARTITION P_201707 或按值,例如PARTITION FOR (TIMESTAMP '2017-07-01 00:00:00')
    猜你喜欢
    • 2020-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-12
    • 2010-09-10
    • 2012-10-11
    • 1970-01-01
    相关资源
    最近更新 更多