版权声明:本文为博主原创文章,未经博主允许不得转载。 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