你有 - 正如他人所建议的 - 有两种选择。第一个是将一个冗余列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你是对的。 。 –