mardi 8 janvier 2013

Optimisation Oracle Index et tables procédures (étape 2)


Il y a un petit moment j’ai mis un article concernant les requêtes permettant d’optimiser les tables et les index dans Oracle.

Ce script est très pratique, et je l’ai fait un peu évoluer afin de le rendre “automatique”. Je vous présente donc la monture v2 en en faisant une procédure. Cette dernière n’a rien de révolutionnaire, quelques curseurs pour parcourir les statements et les exécuter :

CREATE OR REPLACE PROCEDURE SU.REBUILD_INDEX (ma_table IN VARCHAR2)
IS
   CURSOR CURS_REBUILD
   IS
        -- rebuild  
    select 'ALTER INDEX ' || index_name || ' REBUILD ' as txt_sql from user_indexes  where UPPER(table_name) = UPPER(ma_table) and INDEX_TYPE!='LOB';
    R1         CURS_REBUILD%ROWTYPE;

   CURSOR CURS_STRUCT
   IS
        -- validate structure
    select 'ANALYZE INDEX ' || index_name || ' VALIDATE STRUCTURE ' as txt_sql from user_indexes  where UPPER(table_name) = UPPER(ma_table) and INDEX_TYPE!='LOB';
    R2         CURS_STRUCT%ROWTYPE;

   CURSOR CURS_STAT
   IS
        -- stat Analyse
    select 'Analyze Table ' || UPPER(ma_table) || ' Estimate Statistics ' as txt_sql from dual;
    R3         CURS_STAT%ROWTYPE;
      
BEGIN
    ---------rebuild  ----------------------------------------------------
   OPEN CURS_REBUILD;
       LOOP
          FETCH CURS_REBUILD INTO R1;        

            EXIT WHEN CURS_REBUILD%NOTFOUND;

            EXECUTE IMMEDIATE R1.txt_sql;
       END LOOP;
   CLOSE CURS_REBUILD;
   
   DBMS_OUTPUT.PUT_LINE('CURS_REBUILD 1 ok : TABLE : ' || ma_table);
      
   ----------validate structure---------------------------------------------------
   OPEN CURS_STRUCT;
       LOOP
          FETCH CURS_STRUCT INTO R2;        

            EXIT WHEN CURS_STRUCT%NOTFOUND;

            EXECUTE IMMEDIATE R2.txt_sql;
       END LOOP;   
   CLOSE CURS_STRUCT;
   
   DBMS_OUTPUT.PUT_LINE('CURS_REBUILD 2 ok : TABLE : ' || ma_table);
   
   -----------stat Analyse--------------------------------------------------
   OPEN CURS_STAT;
       LOOP
          FETCH CURS_STAT INTO R3;        

            EXIT WHEN CURS_STAT%NOTFOUND;

            EXECUTE IMMEDIATE R3.txt_sql;
       END LOOP;   
   CLOSE CURS_STAT;
   
   DBMS_OUTPUT.PUT_LINE('CURS_REBUILD 3 ok : TABLE : ' || ma_table);

END;
/

Aucun commentaire:

Enregistrer un commentaire