>Select table_name,tablespace_name from user_tables where table_name='table_name’;
2. 查看要清除行迁移的表上的具体索引。
select index_name,table_name from user_indexes where table_name=‘table_name’;
3. Move要清除RM的表到指定的表空间中去。
alter table table_name move tablespace tablespace_name;
4. 重建表上的所有索引。
alter index index_name rebuild;
这种方法适用于8i及其以上的数据库版本,主要是利用数据库的一个MOVE命令来实现行迁移的清除的,MOVE命令的实质其实就是INSERT … SELECT的一个过程,在MOVE表的过程中是需要两倍的原来的表大小的,因为中间过程是要保留原来的旧表的,新表创建完成后旧表就被删除并释放空间了。MOVE的时候要注意后面一定要加上表空间参数,所以必须要先知道表所在的表空间;因为MOVE表之后需要重建索引,所以之前要确定表上的所有的索引。
这种方法对于表记录数很大或者表上索引太多的情况不太适用,因为本身的MOVE就会很慢, 而且MOVE表的时候会要锁定表,时间长了会导致对表的其他操作出现问题,导致数据插入不了丢失数据;MOVE表后还要重建索引,索引太多了的话重建的时间也会太长;再者,这个方法也比较消耗资源,因此强烈建议在业务不繁忙的时候再执行。
以下是一个具体在生产数据库上清除行迁移的例子,在这之前已经调整过表的pctfree参数至一个合适的值了:
SQL>ANALYZE TABLE SERVICE LIST CHAINED ROWS INTO chained_rows;
Table analyzed.
SQL>SELECT count(*) from chained_rows;
COUNT(*)
----------
9145
SQL>select table_name,tablespace_name from user_tables where table_name='SERVICE';
TABLE_NAME TABLESPACE_NAME
------------------------------ ------------------------------
SERVICE DATA
SQL>select index_name,table_name from user_indexes where table_name='SERVICE';
INDEX_NAME TABLE_NAME
------------------------------ ------------------------------
I_SERVICE_ACCOUNTNUM SERVICE
I_SERVICE_DATEACTIVATED SERVICE
I_SERVICE_SC_S SERVICE
I_SERVICE_SERVICECODE SERVICE
PK_SERVICE_SID SERVICE
SQL>select count(*) from SERVICE;
COUNT(*)
----------
518718
SQL>alter table SERVICE move tablespace DATA;
Table altered.
SQL>alter index I_SERVICE_ACCOUNTNUM rebuild;
Index altered.
SQL>alter index I_SERVICE_DATEACTIVATED rebuild;
Index altered.
SQL>alter index I_SERVICE_SC_S rebuild;
Index altered.
SQL>alter index I_SERVICE_SERVICECODE rebuild;
Index altered.
SQL>alter index PK_SERVICE_SID rebuild;
Index altered.
SQL>truncate table chained_rows;
Table truncated.
SQL>ANALYZE TABLE SERVICE LIST CHAINED ROWS INTO chained_rows;
Table analyzed.
SQL>SELECT count(*) from chained_rows;
COUNT(*)
----------
0
利用MOVE命令来清除行迁移,执行的命令都相对比较的简单,上面的例子中清除表SERVCIE中的行迁移的时间大概在五分钟左右,其中move命令执行的时间为不到两分钟,也就是锁表的时间大概是不到两分钟,对于大多数的应用来说一般问题都是不大的,放在系统闲的时候执行基本上不会对应用产生什么太多的影响。
方法六:对于一些行迁移数量巨大而且表记录数巨大的表的行迁移的清除方法
1. 使用TOAD工具或者别的方法获取存在有大量行迁移并且表记录很大的表的重建表的SQL,然后保存为脚本。
2. 使用RENAME命令将原始表重命名为一个备份表,然后删除别的表对原始表上的限制、以及原始表
上一页 [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] 下一页 >>