11G Oracle新增了参考分区,使得主表和子表可以根据主表上的列实现等同分区。
由于参考分区的分区操作都是在主表上进行,而子表会根据主表的分区操作自动进行,所以Oracle提供了DEPENDENT TABLE语句来设置子表的分区存储语句。
看一个简单的例子:
SQL> CREATE TABLE T_PRIMARY
2 (
3 OWNER VARCHAR2(30),
4 TABLE_NAME VARCHAR2(30),
5 TABLESPACE_NAME VARCHAR2(30),
6 STATUS VARCHAR2(18),
7 CONSTRAINT PK_T_PRIMARY PRIMARY KEY (OWNER, TABLE_NAME)
8 )
9 PARTITION BY LIST (TABLESPACE_NAME)
10 (
11 PARTITION P1 VALUES ('SYSTEM'),
12 PARTITION P2 VALUES ('YANGTK'),
13 PARTITION P3 VALUES ('SYSAUX'),
14 PARTITION P4 VALUES (DEFAULT)
15 );
表已创建。
SQL> CREATE TABLE T_FOREIGN
2 (
3 OWNER VARCHAR2(30) NOT NULL,
4 TABLE_NAME VARCHAR2(30) NOT NULL,
5 PARTITION_NAME VARCHAR2(30),
6 SUBPARTITION_NAME VARCHAR2(30),
7 NUM_ROWS NUMBER,
8 BLOCKS NUMBER,
9 CONSTRAINT FK_T_FOREIGN FOREIGN KEY (OWNER, TABLE_NAME)
10 REFERENCES T_PRIMARY (OWNER, TABLE_NAME)
11 )
12 PARTITION BY REFERENCE (FK_T_FOREIGN);
表已创建。
SQL> SELECT TABLE_NAME, PARTITION_NAME, TABLESPACE_NAME
2 FROM USER_TAB_PARTITIONS
3 WHERE TABLE_NAME IN ('T_PRIMARY', 'T_FOREIGN');
TABLE_NAME PARTITION_NAME TABLESPACE_NAME
------------------------------ ------------------------------ ------------------------------
T_PRIMARY P1 USERS
T_PRIMARY P2 USERS
T_PRIMARY P3 USERS
T_PRIMARY P4 USERS
T_FOREIGN P1 USERS
T_FOREIGN P2 USERS
T_FOREIGN P3 USERS
T_FOREIGN P4 USERS
已选择8行。
子表根据主表的TABLESPACE_NAME列实现了等同分区,如果合并P3和P4分区:
SQL> ALTER TABLE T_PRIMARY
2 MERGE PARTITIONS P3, P4
3 INTO PARTITION P3
4 TABLESPACE YANGTK;
表已更改。
SQL> SELECT TABLE_NAME, PARTITION_NAME, TABLESPACE_NAME
2 FROM USER_TAB_PARTITIONS
3 WHERE TABLE_NAME IN ('T_PRIMARY', 'T_FOREIGN');
TABLE_NAME PARTITION_NAME TABLESPACE_NAME
------------------------------ ------------------------------ ------------------------------
T_PRIMARY P1 USERS
T_PRIMARY P2 USERS
T_PRIMARY P3 YANGTK
T_FOREIGN P1 USERS
T_FOREIGN P2 USERS
T_FOREIGN P3 YANGTK
已选择6行。
可以看到,如果不明确指定子表的存储参数,则默认情况下子表的分区依赖主表的分区设置,下面是一个使用DEPENTENT TABLE明确指出子表存储语句的例子:
SQL> ALTER TABLE T_PRIMARY
2 MERGE PARTITIONS P2, P3
3 INTO PARTITION P2
4 TABLESPACE YANGTK
5 DEPENDENT TABLES (T_FOREIGN(PARTITION PF_2 TABLESPACE TEST));
表已更改。
SQL> SELECT TABLE_NAME, PARTITION_NAME, TABLESPACE_NAME
2 FROM USER_TAB_PARTITIONS
3 WHERE TABLE_NAME IN ('T_PRIMARY', 'T_FOREIGN');
TABLE_NAME PARTITION_NAME TABLESPACE_NAME
------------------------------ ------------------------------ ------------------------------
T_PRIMARY P1 USERS
T_PRIMARY P2 YANGTK
T_FOREIGN P1 USERS
T_FOREIGN PF_2 TEST
DEPENDENT TABLES语句可以同时指定多个表的多个分区,下面看一个复杂一点的例子:
SQL> CREATE TABLE T_FOREIGN2
2 (
3 OWNER VARCHAR2(30) NOT NULL,
4 TABLE_NAME VARCHAR2(30) NOT NULL,
5 SEGMENT_NAME VARCHAR2(30),
6 BYTES NUMBER,
7 CONSTRAINT FK_T_FOREIGN2 FOREIGN KEY (OWNER, TABLE_NAME)
8 REFERENCES T_PRIMARY (OWNER, TABLE_NAME)
9 )
10 PARTITION BY REFERENCE (FK_T_FOREIGN2);
表已创建。
SQL> SELECT TABLE_NAME, PARTITION_NAME, TABLESPACE_NAME
2 FROM USER_TAB_PARTITIONS
3 WHERE TABLE_NAME IN ('T_PRIMARY', 'T_FOREIGN', 'T_FOREIGN2');
TABLE_NAME PARTITION_NAME TABLESPACE_NAME
------------------------------ ------------------------------ ------------------------------
T_PRIMARY P1 USERS
T_PRIMARY P2 YANGTK
T_FOREIGN P1 USERS
T_FOREIGN PF_2 TEST
T_FOREIGN2 P1 USERS
T_FOREIGN2 P2 YANGTK
已选择6行。
下面对T_PRIMARY表执行SPLIT操作:
SQL> ALTER TABLE T_PRIMARY
2 SPLIT PARTITION P2
3 VALUES ('YANGTK')
4 INTO (PARTITION P2 TABLESPACE YANGTK,
5 PARTITION P3 TABLESPACE TEST)
6 DEPENDENT TABLES
7 (T_FOREIGN(PARTITION P2 TABLESPACE TEST,
8 PARTITION P3 TABLESPACE USERS),
9 T_FOREIGN2(PARTITION P22 TABLESPACE USERS,
10 PARTITION P23 TABLESPACE YANGTK));
表已更改。
SQL> SELECT TABLE_NAME, PARTITION_NAME, TABLESPACE_NAME
2 FROM USER_TAB_PARTITIONS
3 WHERE TABLE_NAME IN ('T_PRIMARY', 'T_FOREIGN', 'T_FOREIGN2');
TABLE_NAME PARTITION_NAME TABLESPACE_NAME
------------------------------ ------------------------------ ------------------------------
T_PRIMARY P1 USERS
T_PRIMARY P2 YANGTK
T_PRIMARY P3 TEST
T_FOREIGN P1 USERS
T_FOREIGN P2 TEST
T_FOREIGN P3 USERS
T_FOREIGN2 P1 USERS
T_FOREIGN2 P22 USERS
T_FOREIGN2 P23 YANGTK
已选择9行。
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




