У вас есть - как было предложено другими - два варианта. Первый состоит в том, чтобы добавить избыточный столбец DATE
в таблицу T1 (дочерний элемент) и ввести разбиение диапазона на этот столбец.
Второй вариант заключается в использовании ссылочного разбиения. Ниже приведен упрощенный DDL для этих опций.
Диапазон разделения на ребенка
create table T2_P2 /* parent */
(docid number not null,
trans_date date not null,
pad varchar2(100),
CONSTRAINT t2_p2_pk PRIMARY KEY(docid)
);
create table T1_P2 /* child */
(docid number not null,
labid number not null,
trans_date date not null, /** redundant column **/
pad varchar2(100),
CONSTRAINT t1_p2_pk PRIMARY KEY(docid, labid),
CONSTRAINT t1_p2_fk
FOREIGN KEY(docid) REFERENCES T2_P2(docid)
)
PARTITION BY RANGE(trans_date)
(PARTITION Q1_2016 VALUES LESS THAN (TO_DATE('01-APR-2016','DD-MON-YYYY'))
);
Reference раздел
create table T2_RP /* parent */
(docid number not null,
trans_date date not null,
pad varchar2(100),
CONSTRAINT t2_rp_pk PRIMARY KEY(docid)
)
PARTITION BY RANGE(trans_date)
(PARTITION Q1_2016 VALUES LESS THAN (TO_DATE('01-APR-2016','DD-MON-YYYY'))
);
create table T1_RP /* child */
(docid number not null,
labid number not null,
pad varchar2(100),
CONSTRAINT t1_rp_pk PRIMARY KEY(docid, labid),
CONSTRAINT t1_rp_fk
FOREIGN KEY(docid) REFERENCES T2_RP(docid)
)
PARTITION BY REFERENCE(t1_rp_fk);
Ваш вопрос в основном, если первый вариант возможен, поэтому ответ ДА .
Чтобы решить, если первый вариант предпочтительнее я предлагаю проверить три критерия:
миграции
Первый вариант требует новый столбец DATE в дочерней таблице, которая должна быть инициализирована во время миграция (и, конечно, правильная поддержка приложения).
Lifecycle
Это может быть, что жизненный цикл обеих таблиц совпадают (например, как родительские и дочерние записи сохраняются в течение 7 лет). В этом случае предпочтительнее, если обе таблицы разделены (на один и тот же ключ).
Доступ
Для запросов, такие как ниже вы прибыли от эталонного разбиения (обе таблицы обрезки - то есть только перегородки с датой доступа опрашивается).
select * from T2_RP T2 join T1_RP T1 on t2.docid = t1.docid
where t2.trans_date = to_date('01012016','ddmmyyyy');
В первом варианте вы (probalbly) оканчиваться FTS на Т2 и получить обрезке на T1 нужно добавить предикат T2.trans_date = t1.trans_date
Сказав это, я не утверждаю, что ссылка раздел выше. Но я думаю, что стоит рассмотреть оба варианта в вашем контексте и посмотреть, какой из них лучше.
Вопрос в том, может ли таблица с разбиением на разделы иметь ограничение FK, ссылающееся на не секционированную таблицу? –
Чтобы быть понятным, таблица T2, на которую указана таблица, не имеет даты, на которую вы планируете разделить T1, поэтому вы не говорите о [разделении ссылок] (https://docs.oracle.com/cd/E11882_01/ server.112/e25523/partition.htm # CACIHDII)? Итак, что бы вы разделили T1? Или, что рекомендовал ваш администратор базы данных, и почему они объяснили? –
@RicardoArnold Вы правы. . –