Oracle 对引用其他对象的表进行分区

Oracle 对引用其他对象的表进行分区,oracle,constraints,partition,Oracle,Constraints,Partition,我有一个目标表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之前需

我有一个目标表
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进行分区???

在分区T1之前不需要对T2进行分区。外键约束根本不关心分区


祝你好运。

在分割T1之前,没有必要先分割T2。外键约束根本不关心分区


祝你好运。

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

第二种选择是使用引用分区。下面是这些选项的简化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);
您的问题基本上是第一个选项是否可行,因此答案是肯定的

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

迁移

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);
第一个选项要求在子表中有一个新的日期列,该列必须在迁移期间初始化(当然由应用程序维护)

生命周期

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

访问

对于下面这样的查询,您将从引用分区中获益(两个表都被删减了,即只查询具有访问日期的分区)

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


话虽如此,我并不认为引用分区优越。但我认为,在你的背景下研究这两种选择是值得的,看看哪一种更好。

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

第二种选择是使用引用分区。下面是这些选项的简化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);
您的问题基本上是第一个选项是否可行,因此答案是肯定的

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

迁移

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);
第一个选项要求在子表中有一个新的日期列,该列必须在迁移期间初始化(当然由应用程序维护)

生命周期

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

访问

对于下面这样的查询,您将从引用分区中获益(两个表都被删减了,即只查询具有访问日期的分区)

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


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

问题是,分区表是否可以具有引用非分区表的FK约束?请澄清,引用表T2没有您计划对T1进行分区的日期-所以您没有谈论?那么你会怎么做呢?或者,你的DBA推荐了什么,他们解释了为什么吗?@RicardoArnold你是对的@亚历克斯普尔:你也是对的。引用的表T2有一个日期,我猜T1将在该日期进行分区。那么您在T2上添加另一个引用T1日期的FK?你看过我以前链接到的文件了吗?分区T1将减少重复数据和维护。你不必那么做,但你也可以这么做。您有理由违背DBA的建议吗?问题是,分区表是否可以有引用非分区表的FK约束?需要明确的是,引用表T2没有您计划对T1进行分区的日期,所以您没有谈论它?那么你会怎么做呢?或者,你的DBA推荐了什么,他们解释了为什么吗?@RicardoArnold你是对的@亚历克斯普尔:你也是对的。引用的表T2有一个日期,我猜T1将在该日期进行分区。那么您在T2上添加另一个引用T1日期的FK?你看过我以前链接到的文件了吗?分区T1将减少重复数据和维护。你不必那么做,但你也可以这么做。你有理由反对DBA的建议吗?你能分享一些相关的链接吗?这些链接可以帮助我了解我的情况。。谢谢,请分享任何相关链接,这些链接可以帮助我了解我的情况。。谢谢