Oracle 12c 新特性 --- 级联截断和交换分区

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/leo__1990/article/details/90051034

 

概述

TRUNCATE and EXCHANGE partition operations provide cascading functionality for reference-partitioned tables, enabling the inheritance of the partition maintenance operation from the parent to the child tables.

TRUNCATE和EXCHANGE分区操作为引用分区表提供级联功能,使分区维护操作的继承从父表继承到子表。

Cascading data maintenance operations for TRUNCATE and EXCHANGE partition significantly simplifies application development and provides atomic enforcement of logical data consistency.

截断和交换分区的级联数据维护操作大大简化了应用程序开发,并提供了逻辑数据一致性的原子执行。

实验

1) 下面的代码创建了一个带有子引用分区表(T2)的父分区表(T1)。然后用单行填充每个分区。
[[email protected] ~]$ sqlplus "/as sysdba"

SQL*Plus: Release 12.1.0.2.0 Production on Fri Aug 18 09:16:51 2017

Copyright (c) 1982, 2014, Oracle.  All rights reserved.


Connected to:
Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production
With the Partitioning, OLAP, Advanced Analytics and Real Application Testing options


SQL> alter pluggable database all open;

Pluggable database altered.

SQL> show pdbs

    CON_ID CON_NAME			              OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------
	 2 PDB$SEED			                  READ ONLY  NO
	 3 PDBCNDBA			                  READ WRITE NO
	 4 PDBCNDBA2			              READ WRITE NO
SQL> alter session set container=pdbcndba;

Session altered.

SQL> DROP TABLE t2 PURGE;
DROP TABLE t2 PURGE
           *
ERROR at line 1:
ORA-00942: table or view does not exist


SQL> DROP TABLE t1 PURGE;
DROP TABLE t1 PURGE
           *
ERROR at line 1:
ORA-00942: table or view does not exist


SQL> CREATE TABLE t1 (
  id           NUMBER,
  description  VARCHAR2(50),
  created_date DATE,
  CONSTRAINT t1_pk PRIMARY KEY (id)
)
PARTITION BY RANGE (created_date)
(PARTITION part_2014 VALUES LESS THAN (TO_DATE('01/01/2015', 'DD/MM/YYYY')) TABLESPACE users,  
 PARTITION part_2015 VALUES LESS THAN (TO_DATE('01/01/2016', 'DD/MM/YYYY')) TABLESPACE users);
 
Table created.

SQL> 
SQL> CREATE TABLE t2 (
  id             NUMBER NOT NULL,
  t1_id          NUMBER NOT NULL,
  description    VARCHAR2(50),
  created_date   DATE,
  CONSTRAINT t2_pk PRIMARY KEY (id),
  CONSTRAINT t2_t1_fk FOREIGN KEY (t1_id) REFERENCES t1 (id) ON DELETE CASCADE
)
PARTITION BY REFERENCE (t2_t1_fk);

Table created.


SQL> INSERT INTO t1 VALUES (1, 't1 ONE', TO_DATE('01/07/2014', 'DD/MM/YYYY'));

1 row created.

SQL> INSERT INTO t1 VALUES (2, 't1 TWO', TO_DATE('01/07/2015', 'DD/MM/YYYY'));

1 row created.

SQL> INSERT INTO t2 VALUES (1, 1, 't2 ONE', TO_DATE('01/07/2014', 'DD/MM/YYYY')); 

1 row created.

SQL> INSERT INTO t2 VALUES (2, 2, 't2 TWO', TO_DATE('01/07/2015', 'DD/MM/YYYY'));

1 row created.

SQL> COMMIT;

Commit complete.

SQL> EXEC DBMS_STATS.gather_table_stats(USER, 't1');

PL/SQL procedure successfully completed.

SQL> EXEC DBMS_STATS.gather_table_stats(USER, 't2');

PL/SQL procedure successfully completed.


SQL> col table_name for a10
SQL> col partition_name for a40
SQL> SELECT table_name,
       partition_name,
       num_rows
FROM   user_tab_partitions where table_name in ('T1','T2')
ORDER BY 1,2;  2    3    4    5  

TABLE_NAME          PARTITION_NAME			         NUM_ROWS
---------- ---------------------------------------- ----------
T1	   			    PART_2014					     1
T1	   			    PART_2015					     1
T2	   			    PART_2014					     1
T2	   			    PART_2015					     1

2) 使用截断分区…级联命令,我们可以截断父分区以及被引用的子分区,下面的结果可以看到引用的子分区也被截断。
SQL> ALTER TABLE t1 TRUNCATE PARTITION part_2014 CASCADE UPDATE INDEXES;

Table truncated.

SQL> EXEC DBMS_STATS.gather_table_stats(USER, 't1');

PL/SQL procedure successfully completed.

SQL> EXEC DBMS_STATS.gather_table_stats(USER, 't2');

PL/SQL procedure successfully completed.

SQL> SELECT table_name,
       partition_name,
       num_rows
FROM   user_tab_partitions where table_name in ('T1','T2')
ORDER BY 1,2;  2    3    4    5  

TABLE_NAME         PARTITION_NAME			        NUM_ROWS
---------- ---------------------------------------- ----------
T1	               PART_2014					     0
T1	               PART_2015					     1
T2	               PART_2014					     0
T2	               PART_2015					     1


3)测试交换分区…级联命令,创建以下非分区表。对于级联的工作,从交换级别向下的层次结构中的所有表都必须就位。

[[email protected] ~]$ sqlplus "/as sysdba"

SQL*Plus: Release 12.1.0.2.0 Production on Fri Aug 18 09:39:33 2017

Copyright (c) 1982, 2014, Oracle.  All rights reserved.


Connected to:
Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production
With the Partitioning, OLAP, Advanced Analytics and Real Application Testing options


SQL> DROP TABLE t2_temp;
DROP TABLE t2_temp
           *
ERROR at line 1:
ORA-00942: table or view does not exist


SQL> DROP TABLE t1_temp;
DROP TABLE t1_temp
           *
ERROR at line 1:
ORA-00942: table or view does not exist


SQL> CREATE TABLE t1_temp (
  id           NUMBER,
  description  VARCHAR2(50),
  created_date DATE,
  CONSTRAINT t1_temp_pk PRIMARY KEY (id)
); 

Table created.

SQL> CREATE TABLE t2_temp (
  id             NUMBER NOT NULL,
  t1_id          NUMBER NOT NULL,
  description    VARCHAR2(50),
  created_date   DATE,
  CONSTRAINT t2_temp_pk PRIMARY KEY (id),
  CONSTRAINT t2_temp_t1_temp_fk FOREIGN KEY (t1_id) REFERENCES t1_temp (id) ON DELETE CASCADE
);

Table created.

SQL> INSERT INTO t1_temp VALUES (2, 't1_temp TWO', TO_DATE('01/07/2015', 'DD/MM/YYYY'));

1 row created.

SQL> INSERT INTO t2_temp VALUES (2, 2, 't2_temp TWO', TO_DATE('01/07/2015', 'DD/MM/YYYY'));

1 row created.

SQL> commit;

Commit complete.

4) 下面的代码交换双亲和子分区,表的内容也发生改变。
SQL> ALTER TABLE t1
  EXCHANGE PARTITION part_2015
  WITH TABLE t1_temp
  CASCADE
  UPDATE INDEXES;

Table altered.

SQL> COLUMN t1_desc FORMAT A20
SQL> COLUMN t2_desc FORMAT A20
SQL> SELECT t1.description AS t1_desc,
       t2.description AS t2_desc
FROM   t1
       JOIN t2 ON t2.t1_id = t1.id;

T1_DESC 	         T2_DESC
-------------------- --------------------
t1_temp TWO	         t2_temp TWO

SQL> 
SQL> 
SQL> COLUMN t1_temp_desc FORMAT A20
SQL> COLUMN t2_temp_desc FORMAT A20
SQL> SELECT t1_temp.description AS t1_temp_desc,
       t2_temp.description AS t2_temp_desc
FROM   t1_temp
       JOIN t2_temp ON t2_temp.t1_id = t1_temp.id;

T1_TEMP_DESC	     T2_TEMP_DESC
-------------------- --------------------
t1 TWO		         t2 TWO

参考文档

http://docs.oracle.com/database/121/NEWFT/chapter12101.htm#NEWFT198 

http://docs.oracle.com/database/121/VLDBG/GUID-A226B597-BCF1-49E2-8284-739A99D3F9ED.htm#VLDBG1118 

猜你喜欢

转载自blog.csdn.net/leo__1990/article/details/90051034