索引重建

xteitxu發表於2021-12-15

索引在重建時,查詢仍然可以使用舊索引。實際上,oracle在rebuild時,在建立新索引過程中,並不會刪除舊索引,直到新索引rebuild成功。

    從這點可以知道rebuild比刪除重建的一個好處是不會影響原有的SQL查詢,但也正由於此,用rebuild方式建立索引需要相應表空間的空閒空間是刪除重建方式的2倍。


 結論:

  1、rebuild會阻塞對基表的DML操作,但不會影響rebuild期間查詢對原有索引的使用。

  2、rebuild的資料來源可能是基表,也可能是原索引。取決於基表和原索引的大小,哪個小,rebuild時就會用那個作為資料來源。這也說明了網上盛傳的rebuild以原索引作為資料庫的說法是不完全正確的。

  3、rebuild online執行使用者在索引重建期間執行DML操作。

  4、rebuild online的資料來源是基表。


索引是否需要重建指令碼:


col owner format a15 truncate;

col table_name format a30 truncate;

col index_name format a30 truncate;

select

    idx.owner owner,

    idx.table_name tablename,

    idx.index_name index_name,

    idx.blocks idx_blocks,

    tbl.blocks tbl_blocks,

    trunc(idx.blocks/tbl.blocks*100)/100 pct

from

   (select i.owner owner ,i.index_name index_name,

    SUM(S1.blocks) blocks,i.table_owner table_owner,

    i.table_name table_name

    from dba_segments s1,dba_indexes i

    where

     s1.owner=i.owner and 

     s1.segment_name=i.index_name and

     i.owner not in

      ('SYS', 'OUTLN', 'SYSTEM','MGMT_VIEW','SYSMAN','DBSNMP','WMSYS','XDB',

       'DIP','GOLDENGATE','CTXSYS' )

    GROUP BY i.owner ,i.index_name ,i.table_owner , i.table_name ) idx,

   (select t.owner owner ,t.table_name table_name,SUM(s2.blocks) blocks

    from dba_segments s2,dba_tables t

    where

      s2.owner=t.owner and 

      s2.segment_name=t.table_name and

      t.owner

        not in

         ('SYS', 'OUTLN','SYSTEM','MGMT_VIEW','SYSMAN','DBSNMP','WMSYS','XDB',

          'DIP','GOLDENGATE','CTXSYS' )

    GROUP BY T.OWNER,T.TABLE_NAME

    ) tbl

where

    idx.table_owner=tbl.owner and

    idx.table_name=tbl.table_name and

    (idx.blocks/tbl.blocks)>0.5 and

    idx.blocks>200

order by 4;


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

相關文章