扩展现有分区
Extending existing partitioning
下面一个table的简化结构:
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) 对数据进行分区。 table 包含从 200701 到现在 (201511) 的数据。 Failure_start_date < 2013 应划分为一个分区用于较旧的数据。所有较新的月份都应该有一个专用分区,而未来几个月的分区应该自动创建。
这怎么能集成到已经存在的分区中呢?
你不能完全按照你想要的方式去做。分区策略在两个相关方面受到限制:首先,复合策略只能有两个级别(你需要 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)
。
要使用分区修剪,您的查询需要修改为 select active_churn_flags = '01'
,而不是单独指定 active
和 churn_flag
的值.
下面一个table的简化结构:
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) 对数据进行分区。 table 包含从 200701 到现在 (201511) 的数据。 Failure_start_date < 2013 应划分为一个分区用于较旧的数据。所有较新的月份都应该有一个专用分区,而未来几个月的分区应该自动创建。 这怎么能集成到已经存在的分区中呢?
你不能完全按照你想要的方式去做。分区策略在两个相关方面受到限制:首先,复合策略只能有两个级别(你需要 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)
。
要使用分区修剪,您的查询需要修改为 select active_churn_flags = '01'
,而不是单独指定 active
和 churn_flag
的值.