Files
oracle/idev/dba_index_fragmentation.sql
2026-03-12 21:23:47 +01:00

63 lines
2.5 KiB
SQL

-- +----------------------------------------------------------------------------+
-- | Jeffrey M. Hunter |
-- | jhunter@idevelopment.info |
-- | www.idevelopment.info |
-- |----------------------------------------------------------------------------|
-- | Copyright (c) 1998-2012 Jeffrey M. Hunter. All rights reserved. |
-- |----------------------------------------------------------------------------|
-- | DATABASE : Oracle |
-- | FILE : dba_index_fragmentation.sql |
-- | CLASS : Database Administration |
-- | PURPOSE : To ascertain index fragmentation. As a rule of thumb if 10-15% |
-- | of the table data changes, then you should consider rebuilding |
-- | the index. |
-- | NOTE : As with any code, ensure to test this script in a development |
-- | environment before attempting to run it in production. |
-- +----------------------------------------------------------------------------+
SET ECHO OFF
SET FEEDBACK OFF
SET HEADING ON
SET LINESIZE 180
SET PAGESIZE 50000
SET TERMOUT ON
SET TIMING OFF
SET TRIMOUT ON
SET TRIMSPOOL ON
SET VERIFY OFF
CLEAR COLUMNS
CLEAR BREAKS
CLEAR COMPUTES
PROMPT
PROMPT +------------------------------------------------------------------------+
PROMPT | Calculate Index Fragmentation for a Specified Index |
PROMPT +------------------------------------------------------------------------+
PROMPT
ACCEPT index_name CHAR prompt 'Enter index name [SCHEMA].index_name : '
ANALYZE INDEX &index_name VALIDATE STRUCTURE;
COLUMN name HEADING 'Index Name' FORMAT a30
COLUMN del_lf_rows HEADING 'Deleted|Leaf Rows' FORMAT 999,999,999,999,999
COLUMN lf_rows_used HEADING 'Used|Leaf Rows' FORMAT 999,999,999,999,999
COLUMN ibadness HEADING '% Deleted|Leaf Rows' FORMAT 999.99999
SELECT
name
, del_lf_rows
, lf_rows - del_lf_rows lf_rows_used
, TO_CHAR( del_lf_rows /(DECODE(lf_rows,0,0.01,lf_rows))*100,'999.99999') ibadness
FROM index_stats
/
PROMPT
PROMPT Consider rebuilding any index if % of Deleted Leaf Rows is > 20%
PROMPT
UNDEFINE index_name
SET FEEDBACK 6