服务器 频道

Oracle数据库中行迁移/行链接的问题之二

  方法五:使用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命令执行的时间为不到两分钟,也就是锁表的时间大概是不到两分钟,对于大多数的应用来说一般问题都是不大的,放在系统闲的时候执行基本上不会对应用产生什么太多的影响。
  
0
相关文章