分区 table 引用其他

Partitioning a table refenceing other

我有一个没有日期字段的目标 table T1。目前的规模正在迅速扩大。因此我需要添加一个 Date 字段并在此目标 table.

上执行 table 分区
T1 has PRIMARY KEY (DOCID, LABID)
 and has CONSTRAINT FOREIGN KEY (DOCID) REFERENCES T2

Table T2 也很复杂 table 里面有很多规则。

T2 has PRIMARY KEY (DOCID)

我的问题是,因为我需要对 T1 进行分区。是否可以在 T1 分区之前不对 T2 执行任何步骤? DBA 告诉我在接触 T1 之前需要先对 T2 进行分区??

分区T1之前不需要分区T2。外键约束丝毫不关心分区。

祝你好运。

正如其他人所建议的那样,您有两个选择。第一个是在 table T1 (child) 中添加冗余列 DATE 并在此列上引入范围分区。

第二个选项是使用引用分区。下面是这些选项的简化 DDL。

child

上的范围分区
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);

你的问题基本上是第一个选项是否可行,所以答案是肯定的

要确定第一个选项是否更可取,我建议检查三个标准:

迁移

第一个选项需要 child table 中的新 DATE 列,该列必须在迁移期间初始化(当然正确的由应用程序维护)。

生命周期

这两个 table 的生命周期可能是相同的(例如 parent 和 child 记录都保留 7 年)。在这种情况下,如果两个 table 都被分区(在同一个键上),则更可取。

访问

对于如下查询,您将从参考分区中获益(两个 table 都被修剪 - 即仅查询具有访问日期的分区)。

select * from T2_RP T2 join T1_RP T1 on t2.docid = t1.docid
where t2.trans_date = to_date('01012016','ddmmyyyy');

在第一个选项中,您将(可能)在 T2 上以 FTS 结束,而要在 T1 上进行修剪,您需要添加谓词 T2.trans_date = t1.trans_date

话虽如此,我并不认为参考分区更优越。但我认为值得在您的上下文中检查这两个选项,看看哪个更好。