简化表格结构:
create table customer(
incident_id number,
customer_id number,
customer_name varchar2(400),
sla_id number
failure_start_date date,
failure_end_date date,
churn_flag number, -- 0 or 1
active number, -- 0 or 1
constraint pk_incident_id primary key (incident_id))
PARTITION BY LIST (active)
SUBPARTITION BY LIST (churn_flag)
SUBPARTITION TEMPLATE
( SUBPARTITION sp_churn_flag_1 VALUES (1)
, SUBPARTITION sp_churn_flag_0 VALUES (0)
)
(PARTITION sp_active_1 values (1)
, PARTITION sp_active_0 VALUES (0)
)
,
ENABLE ROW MOVEMENT COMPRESS FOR QUERY LOW;
现在我需要在现有的Composite-List-Partition和Interval-Range-Partitioning中添加额外的内容,以便按月对数据进行分区(failure_starte_date - YYYYMM)。该表包含从200701到现在(201511)的数据。 Failure_start_date<应将2013分区为旧数据的一个分区。所有较新的月份都应该有一个专用分区,而未来几个月的分区应该自动创建。 如何将其整合到现有的分区中?
答案 0 :(得分:1)
你无法完全按照自己的方式去做。分区策略以两种相关方式受到限制:首先,复合策略只能有两个级别(需要3个),第二个是区间分区,当在复合策略中使用时必须处于顶层。
这是你想要的最合法的东西:
CREATE TABLE matt_customer
(
incident_id NUMBER,
customer_id NUMBER,
customer_name VARCHAR2 (400),
sla_id NUMBER,
failure_start_date DATE,
failure_end_date DATE,
churn_flag VARCHAR2 (1), -- 0 or 1
active VARCHAR2 (1), -- 0 or 1
active_churn_flags VARCHAR2 (2) GENERATED ALWAYS AS (active || churn_flag) VIRTUAL,
CONSTRAINT pk_incident_id PRIMARY KEY (incident_id)
)
PARTITION BY RANGE
(failure_start_date)
INTERVAL ( NUMTOYMINTERVAL (1, 'MONTH') )
SUBPARTITION BY LIST
(active_churn_flags)
SUBPARTITION TEMPLATE (
SUBPARTITION sp_ac_00 VALUES ('00'),
SUBPARTITION sp_ac_01 VALUES ('01'),
SUBPARTITION sp_ac_10 VALUES ('10'),
SUBPARTITION sp_ac_11 VALUES ('11'))
(PARTITION customer_old VALUES LESS THAN (TO_DATE ('01-JAN-2013', 'DD-MON-YYYY')))
ENABLE ROW MOVEMENT
--COMPRESS FOR QUERY LOW;
;
这使用区间列表分区,并使用虚拟列将active
和churn_flag
列合并为一个(为简单起见,我将这些列转换为VARCHAR2(1)
。
要使用分区修剪,您需要修改查询以选择active_churn_flags = '01'
,而不是单独指定active
和churn_flag
的值。