大量刪除/更新後,索引區塊未釋放,導致空間浪費、掃描效能下降。重建索引可:
SET ECHO OFF FEEDBACK OFF VERIFY OFF PAGESIZE 0 TERMOUT ON HEADING OFF
ACCEPT username CHAR PROMPT 'Enter the index username: '
SPOOL /Oracle/rebuild_&username.sql
SELECT
'REM +-----------------------------------------------+' || CHR(10) ||
'REM | INDEX NAME : ' || owner || '.' || segment_name ||
LPAD('|', 33 - (LENGTH(owner) + LENGTH(segment_name))) || CHR(10) ||
'REM | BYTES : ' || bytes ||
LPAD('|', 34 - LENGTH(bytes)) || CHR(10) ||
'REM | EXTENTS : ' || extents ||
LPAD('|', 34 - LENGTH(extents)) || CHR(10) ||
'REM +-----------------------------------------------+' || CHR(10) ||
'ALTER INDEX ' || owner || '.' || segment_name || CHR(10) ||
'REBUILD ' || CHR(10) ||
'TABLESPACE ' || tablespace_name || CHR(10) ||
'STORAGE ( ' || CHR(10) ||
' INITIAL ' || initial_extent || CHR(10) ||
' NEXT ' || next_extent || CHR(10) ||
' MINEXTENTS ' || min_extents || CHR(10) ||
' MAXEXTENTS ' || max_extents || CHR(10) ||
' PCTINCREASE ' || pct_increase || CHR(10) ||
');' || CHR(10) || CHR(10)
FROM dba_segments
WHERE segment_type = 'INDEX'
AND owner = '&username'
ORDER BY owner, bytes DESC;
SPOOL OFF
AND bytes > &max_bytesPCTINCREASE 設為 0SPOOL c:\Oracle\rebuild_&username.sqlANALYZE INDEX &index_name VALIDATE STRUCTURE;
SELECT height, lf_blks, del_lf_rows, pct_used
FROM index_stats;
關鍵指標:HEIGHT > 3、PCT_USED < 50%、DEL_LF_ROWS / LF_ROWS > 20% 即建議重建。