问题描述
碰到一个有意思的问题,如果分区表执行过SET UNUSED操作,那么是否还可以进行分区的EXCHANGE操作。
一个简单的测试就可以说明这个问题:
SQL> CREATE TABLE t_part_unused 2 (id NUMBER, name varchar2(30), other varchar2(30)) 3 partition BY range (id) 4 (partition p1 VALUES less than (10), 5 partition pmax VALUES less than (maxvalue)); TABLE created. SQL> INSERT INTO t_part_unused 2 SELECT rownum, TABLE_NAME, 'abc' 3 FROM user_tables; 48 ROWS created. SQL> commit; Commit complete. SQL> ALTER TABLE t_part_unused SET unused (other); TABLE altered. SQL> DESC t_part_unused Name NULL? TYPE ---------------------------------------- -------- ------------------------ ID NUMBER NAME VARCHAR2(30) SQL> CREATE TABLE t_temp_unused AS 2 SELECT * 3 FROM t_part_unused 4 WHERE 1 = 2; TABLE created. SQL> DESC t_temp_unused Name NULL? TYPE ---------------------------------------- -------- ------------------------ ID NUMBER NAME VARCHAR2(30) SQL> ALTER TABLE t_part_unused 2 exchange partition p1 3 WITH TABLE t_temp_unused; WITH TABLE t_temp_unused * ERROR at line 3: ORA-14097: COLUMN TYPE OR SIZE mismatch IN ALTER TABLE EXCHANGE PARTITION SQL> ALTER TABLE t_temp_unused ADD (other varchar2(30)); TABLE altered. SQL> ALTER TABLE t_part_unused 2 exchange partition p1 3 WITH TABLE t_temp_unused; WITH TABLE t_temp_unused * ERROR at line 3: ORA-14096: TABLES IN ALTER TABLE EXCHANGE PARTITION must have the same NUMBER OF COLUMNS SQL> ALTER TABLE t_temp_unused SET unused (other); TABLE altered. SQL> ALTER TABLE t_part_unused 2 exchange partition p1 3 WITH TABLE t_temp_unused; TABLE altered.
专家解答
很明显执行了SET UNUSED操作后的表,和普通的表是存在区别的,这种区别导致要求进行EXCHANGE的表必须同样执行SET UNUSED操作,否则就无法执行EXCHANGE的操作。
当目标表中不包含SETE UNUSED的列时,EXCHANGE操作会出现ORA-14097的错误,而如果把列添加到目标表,则会报错ORA-14096,必须在目标表同样对列执行SET UNUSED操作,才能通过EXCHANGE之前的检查。
其实这也不难理解,执行SET UNUSED命令后,数据字典虽然发生了改变,但是表上的数据并没有删除,而EXCHANGE操作只是将两个段的数据字典进行互换,因此如果目标表上缺少SET UNUSED列,是无法执行EXCHANGE操作的。
解决问题的方法有两个,第一个就是例子中展示的可以在目标表上建立列然后同样的执行SET UNUSED操作;另外的一个方法就是对于SET UNUSED列执行DROP COLUMN操作,彻底删除该列。
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。