-- +----------------------------------------------------------------------------+
-- |                          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
