熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Oracle >> 正文

在ORACLE裡按用戶名重建索引的方法

2013-11-13 16:24:52  來源: Oracle 

  如果你管理的ORACLE數據庫下某些應用項目有大量的修改刪除操作 數據索引是需要周期性的重建的
  
  它不僅可以提高查詢性能 還能增加索引表空間空閒空間大小
  
  在ORACLE裡大量刪除記錄後 表和索引裡占用的數據塊空間並沒有釋放
  
  重建索引可以釋放已刪除記錄索引占用的數據塊空間
  
  轉移數據 重命名的方法可以重新組織表裡的數據
  
  下面是可以按ORACLE用戶名生成重建索引的SQL腳本:
  
  
  SET ECHO   OFF;
  SET FEEDBACK OFF;
  SET VERIFY  OFF;
  SET PAGESIZE ;
  SET TERMOUT  ON;
  SET HEADING  OFF;
  ACCEPT username CHAR PROMPT Enter the index username: ;
  spool /oracle/rebuild_&usernamesql;
   SELECT
    REM ++ || chr() ||
    REM | INDEX NAME : || owner  || || segment_name
       || lpad(| (length(owner) + length(segment_name)) )
       || chr() ||
    REM | BYTES   : || bytes
       || lpad (| (length(bytes)) ) || chr() ||
    REM | EXTENTS  : || extents
       || lpad (| (length(extents)) ) || chr() ||
    REM ++ || chr() ||
    ALTER INDEX || owner || || segment_name || chr() ||
    REBUILD || chr() ||
    TABLESPACE || tablespace_name || chr() ||
    STORAGE ( || chr() ||
     INITIAL   || initial_extent || chr() ||
     NEXT     || next_extent || chr() ||
     MINEXTENTS  || min_extents || chr() ||
     MAXEXTENTS  || max_extents || chr() ||
     PCTINCREASE || pct_increase || chr() ||
    ); || chr() || chr()
   FROM  dba_segments
   WHERE segment_type = INDEX
    AND owner=&username
   ORDER BY owner bytes DESC;
  
  spool off;
  
  
  
  如果你用的是WINDOWS系統 想改變輸出文件的存放目錄 修改spool後面的路徑成:
  spool c:\oracle\rebuild_&usernamesql;
  
  如果你只想對大於max_bytes的索引重建索引 可以修改上面的SQL語句:
  在AND owner=&username 後面加個限制條件 AND bytes> &max_bytes
  
  如果你想修改索引的存儲參數 在重建索引rebuild_&usernamesql裡改也可以
  比如把pctincrease不等於零的值改成是零
  
  生成的rebuild_&usernamesql文件我們需要來分析一下 它們是否到了需要重建的程度
  
  分析索引看是否碎片嚴重
  
  SQL>ANALYZE INDEX &index_name VALIDATE STRUCTURE;
  
  col name     heading Index Name     format a
  col del_lf_rows heading Deleted|Leaf Rows  format
  col lf_rows_used heading Used|Leaf Rows   format
  col ratio  heading % Deleted|Leaf Rows format
   SELECT name
      del_lf_rows
      lf_rows del_lf_rows lf_rows_used
      to_char(del_lf_rows / (lf_rows)*) ratio
      FROM index_stats where name = upper(&index_name);
  
  當刪除的比率大於 % 時肯定是需要索引重建的
  
  經過刪改後的rebuild_&usernamesql文件我們可以放到ORACLE的定時作業裡:
  
  比如一個月或者兩個月在非繁忙時間運行
  
  如果遇到ORA錯誤 表示索引在的表上有鎖信息 不能重建索引
  
  那就忽略這個錯誤 看下次是否成功
  
  對那些特別忙的表要區別對待 不能用這裡介紹的方法還要把它們的索引從rebuild_&usernamesql裡刪去
From:http://tw.wingwit.com/Article/program/Oracle/201311/18287.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.