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

在Oracle數據庫中按用戶名重建索引的方法

2013-11-13 22:24:50  來源: 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 coraclerebuild_&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/19038.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.