1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70
| EXECUTE DBMS_STATS.GATHER_SCHEMA_STATS(OWNNAME => 'SCOTT', -
OPTIONS => 'GATHER AUTO', -
ESTIMATE_PERCENT => DBMS_STATS.AUTO_SAMPLE_SIZE, -
METHOD_OPT => 'FOR ALL COLUMNS SIZE AUTO', -
DEGREE => 35, -
GRANULARITY => 'AUTO', -
CASCADE => TRUE, -
FORCE => TRUE);
SET serveroutput ON size unlimited
SET pagesize 0
SET linesize 132
SET feedback ON
SET echo ON
SET trimspool ON
SET verify ON
DECLARE
v_Owner all_indexes.owner%TYPE;
v_IdxName all_indexes.index_name%TYPE;
v_NumRows INTEGER;
v_Height index_stats.height%TYPE;
v_LfRows index_stats.lf_rows%TYPE;
v_DLfRows index_stats.del_lf_rows%TYPE;
v_DLfPerc NUMBER;
v_MaxHeight NUMBER;
v_MaxDel NUMBER;
v_Analyze varchar(4000);
v_Rebuild varchar(4000);
CURSOR cur_GetIdx IS SELECT owner,
index_name,
num_rows
FROM all_indexes
WHERE OWNER = 'SCOTT'
AND num_rows IS NOT NULL
ORDER BY num_rows DESC ;
BEGIN
v_MaxHeight := 0;
v_MaxDel := 2;
FOR CUR IN cur_GetIdx LOOP
v_Owner := CUR.owner ;
v_IdxName := CUR.index_name ;
v_NumRows := CUR.num_rows ;
v_Analyze := 'ANALYZE INDEX ' || v_Owner || '.' || v_IdxName || ' VALIDATE STRUCTURE';
EXECUTE IMMEDIATE v_Analyze;
SELECT height,
lf_rows,
del_lf_rows INTO v_Height,v_LfRows,v_DLfRows
FROM INDEX_STATS ;
IF v_DLfRows = 0 THEN
v_DLfPerc := 0;
ELSE
v_DLfPerc := (v_DLfRows / v_LfRows) * 100;
END IF;
IF (v_Height > v_MaxHeight) OR (v_DLfPerc > v_MaxDel) THEN
v_Rebuild := 'ALTER INDEX ' || v_Owner || '.' || v_IdxName || ' REBUILD;';
EXECUTE IMMEDIATE v_Rebuild;
END IF;
END LOOP;
END;
/ |
Partager