按ID划分的Oracle分区和按时间间隔的DATE的子分区

时间:2015-12-01 19:59:23

标签: database oracle oracle11g data-partitioning

我正在处理的架构有少量客户,每个客户都有大量数据。

在确定分区策略时,我首先考虑的是按customer_id进行分区,然后按日间隔进行分区。但是,您不能在子分区中使用间隔。

最终,我想要一种在新客户创建时自动创建分区的方法,并且还为客户的数据创建自动每日子分区。所有应用程序查询都在customer_id级别,并指定了各种日期范围。

这个post几乎相同,但答案涉及颠倒分区策略,我仍然想找到一种方法来完成范围间隔分区。一种方法可能是每月数据库工作来创建未来几天/几个月的子分区,但这感觉不对。

也许我错误地认为当前的数据结构会从范围间隔分区策略中获益更多。我们有一些客户的数据使其他客户相形见绌,因此我在考虑如何隔离客户数据。

有关更好方法的任何想法/建议吗?

再次感谢你!

更新

以下是我提议的一个例子:

    CREATE TABLE PART_TEST(
            CUSTOMER_ID NUMBER,
            LAST_MODIFIED_DATE DATE
        )
        PARTITION BY RANGE (CUSTOMER_ID) 
        INTERVAL (1) 
        SUBPARTITION BY RANGE (LAST_MODIFIED_DATE)
        SUBPARTITION TEMPLATE
         (
            SUBPARTITION subpart_1206_min values LESS THAN (TO_DATE('12/2006','MM/YYYY')),
            SUBPARTITION subpart_0107 values LESS THAN (TO_DATE('01/2007','MM/YYYY')),
            SUBPARTITION subpart_0207 values LESS THAN (TO_DATE('02/2007','MM/YYYY')),
            ...
            ...
            ...
            SUBPARTITION subpart_max values LESS THAN (MAXVALUE)
         )
         (
         PARTITION part_1 VALUES LESS THAN (1)
         )

我目前在模板中有290个子分区。这似乎是有效的,除了一个障碍。在我的测试中,我发现任何CUSTOMER_ID大于3615的记录都会因ORA-14400而失败:插入的分区键不会映射到任何分区

1 个答案:

答案 0 :(得分:1)

您可以在日期创建var $prev = $(this).prev(); if($prev.length == 0 || !$prev.is('span') { $(this).before( $('<span>') ); } 分区,然后在其上创建RANGE INTERVALLIST子分区。会是这样的:

RANGE

注意,对于第二个解决方案,客户的数量(即ID)是固定的。如果您获得新客户,则必须更改表并相应地修改SUBPARTITION TEMPLATE。

每当插入或更新新值时,Oracle都会自动创建每月分区。