你有 - 正如他人所建議的 - 有兩種選擇。第一個是將一個冗餘列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
第一個選項話雖如此,我並不認爲參考分區優越。但我認爲在你的背景下檢查兩個選項是值得的,並且看看哪一個更好。
問題是分區表是否可以引用非分區表的FK約束? –
需要說明的是,引用的表T2沒有計劃將T1分區的日期 - 因此您不是在談論[引用分區](https://docs.oracle.com/cd/E11882_01/ server.112/e25523/partition.htm#CACIHDII)?那麼你會怎樣劃分T1?或者,你的DBA推薦了什麼,他們解釋了爲什麼? –
@RicardoArnold你是對的。 。 –