2015-11-30 6 views
0

Ниже упрощенная структура таблицы:расширения существующего секционирования

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; 

Теперь мне нужно добавить Additonally к существующему Композиту-List-Partition интервальных-Range-разбиения на разделы, чтобы partitionate данные по месяцам (fail_starte_date - YYYYMM). Таблица содержит данные с 2007 года по настоящее время (201511). Failure_start_date < 2013 должен быть разделен на один раздел для более старых данных. Все новые месяцы должны иметь выделенный раздел, тогда как разделы для предстоящих месяцев должны создаваться автоматически. Как это можно интегрировать в уже существующее partitoning?

+0

Вы хотите сказать, что вы хотите, чтобы каждое подразделение 'churn_flag' содержало несколько подзаголовков для каждого месяца? Если да, зачем? –

+0

Да, это то, что я хочу архивировать. Зачем? У меня много данных, которые можно было бы разделить таким образом. Это улучшит работу инструмента отчетности, запрашивающего эту таблицу. – royskatt

+0

Итак, у вас есть много запросов, в которых вы указываете 'active',' churn_flag', _and_ интервал для 'fail_start_date', _and_, который возвращает столько данных, что вам нужно для сканирования раздела, а не доступа к данным через индекс? –

ответ

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 независимо друг от друга.