扩展现有分区

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

这使用间隔列表分区,并使用虚拟列将您的 activechurn_flag 列合并为一个(为简单起见,我将这些列变成了 VARCHAR2(1)

要使用分区修剪,您的查询需要修改为 select active_churn_flags = '01',而不是单独指定 activechurn_flag 的值.