Oracle's table, index and statistics maintenance...

set serveroutput on size 1000000;

 

DECLARE

  v_current_table   INTEGER;

  v_current_index   INTEGER;

  v_table_count     INTEGER;

  v_index_count     INTEGER;

  v_exception_count INTEGER;

BEGIN

  v_current_table   := 1;

  v_exception_count := 0;

 

  SELECT COUNT(*)

    INTO v_table_count

    FROM all_all_tables aat

   WHERE aat.owner = 'SRQF1'

     AND aat.num_rows IS NOT NULL

   ORDER BY aat.num_rows;

 

  FOR t IN (

            SELECT *

              FROM all_all_tables aat

             WHERE aat.owner = 'SRQF1'

               AND aat.num_rows IS NOT NULL

             ORDER BY aat.num_rows

           )

  LOOP

    dbms_output.put_line('Processing table ' || t.owner || '.' || t.table_name || ' - ' || v_current_table ||

                         ' of ' || v_table_count || '...');

 

    BEGIN

      EXECUTE IMMEDIATE 'ALTER TABLE ' || t.owner || '.' || t.table_name || ' ENABLE ROW MOVEMENT';

      EXECUTE IMMEDIATE 'ALTER TABLE ' || t.owner || '.' || t.table_name || ' SHRINK SPACE CASCADE';

      EXECUTE IMMEDIATE 'ALTER TABLE ' || t.owner || '.' || t.table_name || ' DISABLE ROW MOVEMENT';

    EXCEPTION

      WHEN OTHERS THEN

        v_exception_count := v_exception_count + 1;

        BEGIN

          EXECUTE IMMEDIATE 'ALTER TABLE ' || t.owner || '.' || t.table_name || ' DISABLE ROW MOVEMENT';

        EXCEPTION

          WHEN OTHERS THEN

            v_exception_count := v_exception_count + 1;

        END;

        dbms_output.put_line('    Failed to shrink space cascade. Skipping...');

    END;

 

    v_current_index := 1;

 

    SELECT COUNT(*)

      INTO v_index_count

      FROM all_indexes ai

     WHERE ai.table_owner = t.owner

       AND ai.table_name = t.table_name

       AND ai.num_rows IS NOT NULL

     ORDER BY ai.num_rows;

 

    FOR i IN (

              SELECT *

                FROM all_indexes ai

               WHERE ai.table_owner = t.owner

                 AND ai.table_name = t.table_name

                 AND ai.num_rows IS NOT NULL

               ORDER BY ai.num_rows

             )

    LOOP

      dbms_output.put_line('    Processing index ' || i.owner || '.' || i.index_name || ' - ' || v_current_index ||

                           ' of ' || v_index_count || '...');

   

      BEGIN

        EXECUTE IMMEDIATE 'ALTER INDEX ' || i.owner || '.' || i.index_name || ' REBUILD';

      EXCEPTION

        WHEN OTHERS THEN

          v_exception_count := v_exception_count + 1;

          dbms_output.put_line('        Failed to index rebuild. Skipping...');

      END;

   

      v_current_index := v_current_index + 1;

    END LOOP;

 

    dbms_output.put_line('    Gathering table stats...');

    BEGIN

      dbms_stats.gather_table_stats(t.owner, t.table_name);

    EXCEPTION

      WHEN OTHERS THEN

        v_exception_count := v_exception_count + 1;

        dbms_output.put_line('        Failed to gather stats. Skipping...');

    END;

 

    v_current_table := v_current_table + 1;

  END LOOP;

END;

/

 

set serveroutput off;

 

No Comments