2016-03-07 74 views
0

我有一個沒有日期字段的目標表T1。目前的規模正在迅速增加。因此,我需要添加一個日期字段,並在此目標表上執行表分區。劃分一個表,其他

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

T2也是複雜的表,它有很多規則。

T2 has PRIMARY KEY (DOCID) 

我的問題是,因爲我需要對T1進行分區。在T1分區之前是否可以不對T2執行任何步驟? DBA告訴我,我在觸摸T1之前需要先分割T2?

+0

問題是分區表是否可以引用非分區表的FK約束? –

+0

需要說明的是,引用的表T2沒有計劃將T1分區的日期 - 因此您不是在談論[引用分區](https://docs.oracle.com/cd/E11882_01/ server.112/e25523/partition.htm#CACIHDII)?那麼你會怎樣劃分T1?或者,你的DBA推薦了什麼,他們解釋了爲什麼? –

+0

@RicardoArnold你是對的。 。 –

回答

1

在分區T1之前不需要對T2進行分區。外鍵約束不關心分區的細節。

祝你好運。

+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')) ); 

基準分區

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

你提的問題基本上是如果第一個選項是可能的,所以答案是YES

,以決定是否在第一個選項是最好我建議檢查三個標準:

遷移

第一個選項需要在子表的新日期欄過程中必須初始化遷移(當然,由應用程序正確維護)。

生命週期

這可能是這兩個表的生命週期是相同的(例如雙方父母和子女記錄保留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在T2結束,並獲得修剪的T1,你需要添加謂詞T2.trans_date = t1.trans_date

第一個選項話雖如此,我並不認爲參考分區優越。但我認爲在你的背景下檢查兩個選項是值得的,並且看看哪一個更好。