2016-03-07 73 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

第一个选项话虽如此,我并不认为参考分区优越。但我认为在你的背景下检查两个选项是值得的,并且看看哪一个更好。