Oracle Partition by ID 和 subpartition by DATE with interval
Oracle Partition by ID and subpartition by DATE with interval
我正在处理的模式有少量客户,每个客户有大量数据。
在确定分区策略时,我首先想到的是按customer_id分区,然后再按间隔天的范围进行子分区。但是,您不能在子分区中使用间隔。
最终我想要一种方法来在创建新客户时自动为他们创建分区,并且还为客户的数据自动创建每日子分区。所有应用程序查询都在 customer_id 级别,并指定了各种日期范围。
这个几乎是一模一样的,但是答案涉及到反转分区策略,我还是想找到一种方法来完成range-range区间分区。一种方法可能是让每月的数据库作业为未来的 days/months 创建子分区,但这感觉不对。
也许我的假设是错误的,即当前数据结构将从范围-范围间隔分区策略中获益更多。我们有几个客户的数据让其他客户相形见绌,所以我在想办法隔离客户数据。
任何 thoughts/suggestions 更好的方法?
再次感谢!
更新
这是我提议的一个例子:
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 而失败:插入的分区键未映射到任何分区
您可以在 date 上创建一个 RANGE INTERVAL
分区,然后在其上创建 LIST
或 RANGE
子分区。会是这样的:
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)是固定的。如果您有新客户,则必须更改 table 并相应地修改 SUBPARTITION TEMPLATE。
每当插入或更新新值时,Oracle 都会自动创建每月分区。
我正在处理的模式有少量客户,每个客户有大量数据。
在确定分区策略时,我首先想到的是按customer_id分区,然后再按间隔天的范围进行子分区。但是,您不能在子分区中使用间隔。
最终我想要一种方法来在创建新客户时自动为他们创建分区,并且还为客户的数据自动创建每日子分区。所有应用程序查询都在 customer_id 级别,并指定了各种日期范围。
这个
也许我的假设是错误的,即当前数据结构将从范围-范围间隔分区策略中获益更多。我们有几个客户的数据让其他客户相形见绌,所以我在想办法隔离客户数据。
任何 thoughts/suggestions 更好的方法?
再次感谢!
更新
这是我提议的一个例子:
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 而失败:插入的分区键未映射到任何分区
您可以在 date 上创建一个 RANGE INTERVAL
分区,然后在其上创建 LIST
或 RANGE
子分区。会是这样的:
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)是固定的。如果您有新客户,则必须更改 table 并相应地修改 SUBPARTITION TEMPLATE。
每当插入或更新新值时,Oracle 都会自动创建每月分区。