方法五:使用MOVE命令来清除行迁移的方法
1. 查看要清除行迁移的表所在的表空间。
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命令执行的时间为不到两分钟,也就是锁表的时间大概是不到两分钟,对于大多数的应用来说一般问题都是不大的,放在系统闲的时候执行基本上不会对应用产生什么太多的影响。
Oracle数据库中行迁移/行链接的问题之二
0
相关文章