Table 在大量刪除歷史紀錄後,原先使用的儲存空間並不會自動被釋出,而是要經過一個 Table 的重組程序,可用空間才會有所變更。

    說明

    要調整 HWM 有以下方式可以做,各有不同優缺點:

    1. export / import
      object id 與 data object id 會改變
    2. alter table <table.name> move;
      data object id,rowid 會改變
    3. alter index <index.name> rebuild online;
      一般會與第 2 項配合一起做
    4. shrink table
      Oracle 10g 以上支援
    Shrink Table

    必要條件

    1.  Enable row movement
    2. Table 所在的 tablespace 不能使用在 segment space management manaual 的tablespace, 必須為 auto (預設)

     

    執行時分兩階段

    1. compact:透過 insert / delete 將資料盡量排例在 segment 前面。這個階段會造成rowid的改變,因此需要enable row movement。
    2. HWM 調整:這個階段是調整HWM位置,釋放表格空間。

     

    SQL

    alter table <TABLE_NAME> shrink space compact ; 只會執行第一階段 
    alter table <TABLE_NAME> shrink space ; 兩個階段都會執行 
    alter table <TABLE_NAME> shrink space cascade ; 同時處理相關index 空間
    
    alter index <INDEX_NAME> shrink space ; 回收index 空間 
    alter table <TABLE_NAME> modify lob (<lob_clomun>) (shrink space);
    

    NOTE

    由於 alter table TABLE_NAME enable row movement 可能會使得引用該 table的 object( ex procedure,package,view...) 變成 invalid。解決方法 參閱 Q & A

    主要步驟

     Shrink 指令:單一個 Table

    SQL> alter table <owner>.<table_name> enable row movement;
    SQL> alter table <owner>.<table_name> shrink space cascade;
    SQL> alter table <owner>.<table_name> disable row movement; 
    

    Shrink:多個 Tables

    set heading off
    set feedback off
    set pagesize 0
    set linesize 1000
    
    SELECT 'alter table ' || OWNER || '.' || TABLE_NAME || ' enable row movement;' || chr(10) || 'alter table ' || OWNER || '.' || TABLE_NAME || ' shrink space cascade;' || chr(10) || 'alter table ' || OWNER || '.' || TABLE_NAME || ' disable row movement;' || chr(10)
    FROM ALL_TABLES
    WHERE OWNER = 'WIN_FDC_STDB'
    AND (
    TABLE_NAME NOT LIKE '%DEF%'
    AND TABLE_NAME LIKE 'PROC%'
    )
    ORDER BY NUM_ROWS DESC, TABLE_NAME ASC;
    
    標籤 (Edit tags)
    • No tags
    您必須 登入 才能發佈評論。
    Powered by MindTouch Core