oracle碎片整理

由于经常delete,insert,update数据,所以会在表空间留下一些碎片,造成查询速度变慢,表空间得不到很好的利用。

为了消除碎片可以采用移动表的方法解决;就是一个表空间的所有表移动到一个干净的表空间中,由于对表进行了移动,在表上创建的索引将失效,所以在移动表的同时也要将表的索引重建。

可以采用如下一个存储过程来完成表移动:
/*
功能:为数据表改变表空间,或在同一表空间下移动到不同的数据段。
说明:为了消除表空间的碎片,可以将一个表空间的表移动到另一个表空间,
      并重建被移动表的索引。
作者:陈利,  2008年4月2日
*/

create or replace procedure p_remove_all_table
 (source_space_name in varchar2,--源表空间
 dest_space_name in varchar2)--目的表空间
as
  sqlt varchar(200);
begin
    --取所有非临时表
    for tab in (select table_name, tablespace_name from user_tables
                       where tablespace_name=source_space_name and temporary = 'N') loop
        if dest_space_name is null then
            --如果为null,则在本表空间下移动           
            sqlt := 'alter table ' || tab.table_name || ' move';
        elsif upper(dest_space_name) <> tab.tablespace_name then
            --如果目标表空间和现在的表空间不一致,则移动到新的表空间
            sqlt := 'alter table ' || tab.table_name || ' move tablespace ' || dest_space_name;
        else
            --如果目标表空间和现在的表空间要同,则跳过
            goto continue; 
        end if ;
       
        begin
        --dbms_output.put_line(sqlt);
        EXECUTE IMMEDIATE sqlt;
        exception when others then
          --打印错误信息
          dbms_output.put_line('移动表'|| tab.table_name ||'失败');
          dbms_output.put_line('==错误信息'||substr(sqlerrm, 1, 100));
          goto continue;
        end;
       
       
        --重建索引
        for idx in(select a.index_name,a.tablespace_name from user_indexes a
                     where a.table_name=tab.table_name ) loop
           sqlt := 'alter index ' || idx.index_name || ' rebuild ';
           /*if upper(idx_spacename) <> idx.tablespace_name then
              sqlt := 'alter index ' || idx.index_name || ' rebuild tablespace ' || tablespace_name;
           else
              --原空间重建索引
              sqlt := 'alter index ' || idx.index_name || ' rebuild ';
           end if;*/
           EXECUTE IMMEDIATE sqlt;
        end loop;
       
        <<continue>>
        null;
     end loop;
end;

请大家多提一些建议。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值