扩展现有分区

时间:2015-11-30 13:59:53

标签: oracle database-partitioning

简化表格结构:

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分区为旧数据的一个分区。所有较新的月份都应该有一个专用分区,而未来几个月的分区应该自动创建。 如何将其整合到现有的分区中?

1 个答案:

答案 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;
;

这使用区间列表分区,并使用虚拟列将activechurn_flag列合并为一个(为简单起见,我将这些列转换为VARCHAR2(1)

要使用分区修剪,您需要修改查询以选择active_churn_flags = '01',而不是单独指定activechurn_flag的值。