ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 行迁移的方法

行迁移的方法

原创 Linux操作系统 作者:liujian 时间:2010-04-24 21:18:16 0 删除 编辑

         Row Migration(行迁移)在数据库中的存在,会导致数据库的性能降低。

        首先行迁移发生在当存储在block上的一行记录需要更新操作导致行长增加了,而使得block的自由空间已经完全充满了(这取决于pctfree,pctused的设置)。

       现在我们来了解oracle数据库中插入一条记录的机制。oracle会在free list 中先去寻找一个自由的块,并且将数据插入到自由块中。恰巧这个块是由pctfree的值决定的,并且直到块中的自由空间达到pctfree 的值后,此块才会从free list中挪走,当使用的块的空间低于pctused时,此块又被重新放到free list 中。

        假设一条记录占用一个block的10%的空间,当更新一条记录的时候,而此时该block中剩下的自由空间(如5%),不够存放更新的这条记录(如使其行增长15%),于是oracle会在free list 中寻找一个自由空间(10%+15%=25%)的block来存放这行记录,而原来的block保存了指向block的指针,这时候产生了行迁移。

      了解了产生行迁移的机制后,我们再来探讨如何在解决行迁移。

1.传统清除行迁移的方法:(如果数据库中很多表有关联,有外键等的限制的话,是无法delete掉所有的行迁移的记录行的)

(1)执行$oracle_home/rdbms/admin/utlchain.sql脚本创建chained_rows表。

(2)将存在行迁移的表中的产生行迁移的行的Rowid放入到chained_rows表中。

 ANALYZE TABLE table_name LIST CHAINED ROWS INTO chained_rows;

(3) 将表中的行迁移的row id放入临时表中保存。

CREATE TABLE table_name_temp AS  SELECT * FROM table_name WHERE rowid IN (SELECT head_rowid FROM chained_rows WHERE table_name='table_name');

(4)删除原来表中存在的行迁移的记录行。

DELETE table_name WHERE rowid IN (SELECT chained_rows  WHERE table_name ='table_name');

(5) 从临时表中取出且重新把那些被删除了的数据插入到原来的表中,并删除临时表。

INSERET INTO table_name SELECT * FROM table_name_temp;

DROP TABLE table_name_temp;

2.使用TOAD工具清除行迁移的方法

(1)备份要清除RM的表。

RENAME table_name TO table_name_temp;

(2)drop 掉所有其他表上关联到table_name 的外键限制。

(3)重建(1)中被rename的表

(4)重建表中原来的数据。

INSERT/*+APPEND*/INTO table_name SELECT * FROM table_name_temp;

(5)删除在table_name_temp 上的索引和关联其他表的外键。

(6)在table_name 上建立和原来一样的索引、主键和所有的外键限制。

(7)重新编译相关的存储过程,函数和包。

(8)删除表table_name_temp;

3.使用MOVE 命令来清除行迁移的方法

(1)查看要清除行迁移的表所在的表空间。

select table_name,tablespace_name fromuser_tables where table_name=‘table_name’;

(2)查看要清除行迁移的表上的具体索引。

select index_name,table_name from user_indexes wheretable_name=‘table_name’;

(3)move要清除RM的表到指定的表空间中去。

alter table table_name move tablespace tablespace_name;

(4)重建表上的所有索引。

alter index index_name rebuild;

此外还有其他一些方法来清除行迁移,这只是在理论上能够清除行迁移,在实际环境中还要具体分析。很高兴与大家一起分享oracle的博大精深。

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/1776300/viewspace-660662/ ,如需转载,请注明出处,否则将追究法律责任。

上一篇: 没有了~
下一篇: 没有了~
请登录后发表评论 登录
全部评论

注册时间:2010-04-24

  • 博文量
    1
  • 访问量
    1108