Oracle物化视图:分区策略

Oracle物化视图:分区策略,oracle,data-warehouse,partitioning,materialized-views,Oracle,Data Warehouse,Partitioning,Materialized Views,我有一个按年(char)、月(char)和其他3个维度组织的摘要物化视图,然后是许多度量。我的数据跨度从2013年到现在,并且持续增加 由于基础事实表是巨大的(每年增加500+M行,增加100+M行),我正在考虑对表和MV进行分区,以便只刷新MV中的最后12个月 在多次阅读之后,我打算按范围(每个月)划分事实表,按月份划分MV,并按年份细分它 我知道分区策略对性能至关重要,所以我要问的是,是否有人有更好的解决方案,或者我制定的解决方案是最优的 谢谢大家! MV分区的代码示例: CREATE MA

我有一个按年(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
   ...
;

为什么不按月份进行简单分区呢?按月份进行分区,按年份进行子分区是没有任何意义的。删除旧分区是不可能的,一般来说,维护是相当困难的

SELECT
...
TO_TIMESTAMP(year||month, 'YYYYMM') AS PARTITION_KEY,
...
对你来说,MView:

PARTITION BY RANGE (PARTITION_KEY) INTERVAL (INTERVAL '1' MONTH)
这还可以避免任何分区维护


关于性能,这在很大程度上取决于您在其上运行的主要查询。分区表上的性能很容易比非分区表上的性能差。若您的主要查询并没有选择特定的日期范围,那个么按日期划分是矛盾的(就性能而言)

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