2016-03-07 3 views
0

У меня есть таблица целей T1, у которой нет поля даты. Текущий размер быстро растет. Поэтому мне нужно добавить поле Date, а также выполнить разбиение таблиц на эту целевую таблицу.Разделение таблицы повторного использования других

T1 has PRIMARY KEY (DOCID, LABID) 
and has CONSTRAINT FOREIGN KEY (DOCID) REFERENCES T2 

T2 Таблица также сложные таблицы и имеет много правил в нем.

T2 has PRIMARY KEY (DOCID) 

Мой вопрос в том, что мне нужно разделить T1. Возможно ли НЕ выполнить какой-либо шаг для T2 до того, как T1 будет разделом? DBA сказал мне, что мне нужно разделить T2 прежде, чем я коснусь T1 ??

+0

Вопрос в том, может ли таблица с разбиением на разделы иметь ограничение FK, ссылающееся на не секционированную таблицу? –

+0

Чтобы быть понятным, таблица T2, на которую указана таблица, не имеет даты, на которую вы планируете разделить T1, поэтому вы не говорите о [разделении ссылок] (https://docs.oracle.com/cd/E11882_01/ server.112/e25523/partition.htm # CACIHDII)? Итак, что бы вы разделили T1? Или, что рекомендовал ваш администратор базы данных, и почему они объяснили? –

+0

@RicardoArnold Вы правы. . –

ответ

1

Не нужно разделять T2 перед разделением T1. Внешние ограничения ключа не заботятся ни о чем немного о разделении.

Удачи.

+0

Можете ли вы поделиться какой-либо связанной ссылкой, которая может рассказать о моем сценарии .. спасибо –

1

У вас есть - как было предложено другими - два варианта. Первый состоит в том, чтобы добавить избыточный столбец 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

Сказав это, я не утверждаю, что ссылка раздел выше. Но я думаю, что стоит рассмотреть оба варианта в вашем контексте и посмотреть, какой из них лучше.

Смежные вопросы