RMINAL SELECT * FROM TERMINAL_temp;
8302 rows created.
SQL>alter table CONN disable constraint SYS_C003200;
Table altered.
SQL>select count(*) from terminal;
COUNT(*)
----------
647799
SQL>truncate table chained_rows;
Table truncated.
SQL>ANALYZE TABLE TERMINAL LIST CHAINED ROWS INTO chained_rows;
Table analyzed.
SQL>select count(*) from chained_rows;
COUNT(*)
----------
0
从上面过程中可以看出,对TERMINAL这张表的行迁移清除耗时总共不到五分钟的时间,总体来说还是比较快的。从我在生产数据库中清除行迁移的经验来说,这种方法基本适用于大部分存在有行迁移的表。
方法三:使用TOAD工具清除行迁移的方法
1. 备份要清除RM的表。
RENAME table_name TO table_name_temp;
2. Drop 所有其它表上关联到table_name的外键限制。
SELECT CONSTRAINT_NAME,CONSTRAINT_TYPE,TABLE_NAME from USER_CONSTRAINTS where R_CONSTRAINT_NAME in (SELECT CONSTRAINT_NAME from USER_CONSTRAINTS where TABLE_NAME='table_name' AND CONSTRAINT_TYPE=’P’);
ALTER TABLE table_name DROP CONSTRAINT XXXX;(XXXX为上述的查询结果)
3. 重建1中被rename的表。
CREATE TABLE table_name AS SELECT * FROM table_name_temp WHERE 0 = 1;
4. 重建表中原来的数据。
INSERT /*+ APPEND */ INTO table_name SELECT * FROM table_name_temp;
5. 删除在table_name_temp上的索引和关联其他表的外键。
6. 在table_name上建立和原来一样的索引、主键和所有的外键限制。
7. 重新编译相关的存储过程、函数和包。
8. 删除表table_name_temp。
对于使用这种方法来清除行迁移,全部的代码都是可以由TOAD工具来生成的。由于此方法把表上的关联考虑进去了,也是一种比较的全面的考虑的一种清除方法,而且在清除过程中重建了表和索引,对于数据库的存储和性能上都有提高。因为这种方法一开始是rename表为临时表,然后重建一个新表出来的,因此需要两倍的表的空间,因此在操作之前一定要检查要清除的表所在的表空间的free空间是否足够;但是也有一定的缺陷,因为在新表中重新插入原来的数据后需要重建索引和限制,因此在时间和磁盘的空间上都有比较大的开销,而且对于前台的应用可能会有一段时间的中断,当然,这个中断时间就主要是消耗在重建索引和重建限制上了,而时间的长短跟需要重建索引和限制的多少以及表的记录多少等等因素都有关系。使用这种方法对于7*24小时要求的系统上清除行迁移不是很合适,因为使用这种方法会导致系统可能有一段时间的停机,如果系统的实时性比较高,这种方法就不是很适用了。
方法四:使用EXP/IMP工具清除行迁移的方法
1. 使用EXP导出存在有行迁移的表。
2. 然后TRUNCATE原来的表。
3. IMP开始导出的表。
4. 重建表上所有的索引。(可选)
使用这种方法可以不用重建索引,省去了这部分时间,但是完成之后索引的使用效率不会很高,最好是在以后逐步的在线重建索引,这样是可以不需要中断业务的。但是需要考虑的是IMP的时候会比较慢,而且会占用比较大的IO,应该选择在应用不是很繁忙的时候做这项工作,否则会对应用的正常运行产生较大的影响。对于这种方法还存在有一个比较大的弊端,就是在EXP表的时候要保证该表是没有数据的更新或者是只读状态的,不能对表有插入或者更新操作,否则会导致数据的丢失。
SQL> select count(*) from test;
COUNT(*)
----------
169344
SQL> truncate table chained_rows;
Table truncated.
SQL> analyze table test LIST CHAINED ROWS INTO chained_rows;
Table analyzed.
SQL> select count(*) from chained_rows;
COUNT(*)
----------
3294
$ exp allan/allan file=test.dmp tables=test
Export: Release 9.2.0.3.0 - Production on Sun Jun 6 13:50:08 2004
Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.
Connected
上一页 [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] 下一页 >>