暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

参考分区的DEPENDENT TABLE语句

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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论