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的建议吗?你能分享一些相关的链接吗?这些链接可以帮助我了解我的情况。。谢谢,请分享任何相关链接,这些链接可以帮助我了解我的情况。。谢谢