ORACLE碎片整理二(轉載)

why566發表於2008-09-19

由於經常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;
       
        <>
        null;
     end loop;
end;

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/7478833/viewspace-450285/,如需轉載,請註明出處,否則將追究法律責任。

相關文章