2015-12-01 62 views
1

我正在使用的模式有少量客户,每个客户都有大量数据。Oracle按分区划分ID和按DATE分区间隔

在确定分区策略时,我的第一个想法是按customer_id进行分区,然后按区间隔分配一个白天区间。但是,您不能在子分区中使用间隔。

最终,我希望能够在创建新客户时自动创建分区,同时还为客户数据创建自动日常子分区。所有应用程序查询均在customer_id级别指定了各种日期范围。

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

也许我错了,我的假设是当前的数据结构将从范围区间间隔分区策略中受益更多。我们有一些客户的数据与其他客户相差甚远,所以我正在想办法隔离客户数据。

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

再次感谢您!

UPDATE

这里是我提出的一个例子:

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:插入分区键没有映射到任何分区

+0

根据[逻辑数据库限制](https://docs.oracle.com/cloud/latest/db121/REFRN/refrn0043.htm#REFRN0043),最多可以有1'048'575个分区。你有290 * 3'615 = 1'048'350。我**真的**推荐你修改你的分区计划!你在桌面上有多少条记录?万亿? –

+0

谢谢Wernfried,最终我只期望大概2000个客户,但在分区策略方面显然过度。该数据库是一个多租户系统,我的目标是找到一种方法将每个客户数据划分为多个部分以帮助提高性能等等,这是我在CUSTOMER_ID级别进行分区的原因,然后是按月/年进行分区划分的原因。 – rcurrie

回答

1

,您可以拨打RANGE INTERVAL分区上的日期,然后LISTRANGE子分区上它。会是这样:

CREATE TABLE MY_PART_TABLE 
(
    CUSTOMER_ID      NUMBER    NOT NULL, 
    THE_DATE     TIMESTAMP(0) NOT NULL, 
    OTHER_COLUMNS NUMBER 
) 
PARTITION BY RANGE (THE_DATE) INTERVAL (INTERVAL '1' MONTH) 
    SUBPARTITION BY RANGE (CUSTOMER_ID) 
     SUBPARTITION TEMPLATE (
     SUBPARTITION CUSTOMER_GROUP_1 VALUES LESS THAN (10), 
     SUBPARTITION CUSTOMER_GROUP_2 VALUES LESS THAN (20), 
     SUBPARTITION CUSTOMER_GROUP_3 VALUES LESS THAN (30), 
     SUBPARTITION CUSTOMER_GROUP_4 VALUES LESS THAN (40), 
     SUBPARTITION CUSTOMER_GROUP_5 VALUES LESS THAN (MAXVALUE) 
     ) 
(PARTITION VALUES LESS THAN (TIMESTAMP '2015-01-01 00:00:00')); 



CREATE TABLE MY_PART_TABLE 
(
    CUSTOMER_ID      NUMBER    NOT NULL, 
    THE_DATE     TIMESTAMP(0) NOT NULL, 
    OTHER_COLUMNS NUMBER 
) 
PARTITION BY RANGE (THE_DATE) INTERVAL (INTERVAL '1' MONTH) 
    SUBPARTITION BY LIST (CUSTOMER_ID) 
     SUBPARTITION TEMPLATE (
     SUBPARTITION CUSTOMER_1 VALUES (1), 
     SUBPARTITION CUSTOMER_2 VALUES (2), 
     SUBPARTITION CUSTOMER_3_to_6 VALUES (3,4,5,6), 
     SUBPARTITION CUSTOMER_7 VALUES (7) 
     ) 
(PARTITION VALUES LESS THAN (TIMESTAMP '2015-01-01 00:00:00')); 

注意,对于客户的第二溶液中的数量(即ID的)是修复。如果您获得新客户,则必须更改表格并相应地修改SUBPARTITION TEMPLATE。

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

+0

谢谢。这与我在上面发布的链接中的解决方案类似。然而,我认为这还不是我所掌握的数据。我宁愿找到一个主要在CUSTOMER_ID上进行分区,然后在DAY上进行子分区的解决方案。最有可能我会有一个子分区模板多个月等。 – rcurrie

+0

我不建议这样做,你会失去INTERVAL分区的强大功能,Oracle会在需要时自动创建新分区(包括子分区)。 –

+0

我还在计划在CUSTOMER_ID上使用INTERVAL(1)和子分区模板进行间隔分区。这样,每次创建新客户时,都会创建一个新的分区,并且还会创建几个月的子分区。我可以用这个示例更新问题... – rcurrie