Affichage des articles dont le libellé est sql. Afficher tous les articles
Affichage des articles dont le libellé est sql. Afficher tous les articles

mardi 22 janvier 2013

Savoir si les clés étrangères (FK) sont présente (Oracle)


Pour connaitre les tables qui dispose ou non de foreign key (clés étrangères –FK). j’ai conçus une petit fonction Oracle pour déterminer l’existence sur une table d’une FK par rapport a un champs.

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;
/

jeudi 24 mai 2012

Optimisation Oracle Index et tables

Bonjour,

Je viens de découvrir les ordres des requêtes SQL qui permettent d’optimiser les tables et index d'une table.

Cela permet via script (automatique) et par exemple suite a de grosse opération de mise a jour (update / delete), de restructurer la table en question.
select 'ALTER INDEX ' || index_name || ' REBUILD;' from user_indexes  where table_name = 'MA_TABLE';
select 'ANALYZE INDEX ' || index_name || ' VALIDATE STRUCTURE;' from user_indexes  where table_name = 'MA_TABLE';
Analyze Table MA_TABLE Estimate Statistics;

A la fin du script permet de tout mettre tout propre ^^

Voila en espérant que ces instructions puisse vous aidez.
Par contre, ce que je n'ai pas fait (par manque de temps) est le Benchmark de ses actions pour savoir le gain. Il aurait fallut analyse les performances avant la mise a jour des index/tables et après l'opération pour avoir le rapport de performance.
Dans tous les cas, cela ne peux pas faire de mal :)

vendredi 4 mai 2012

Concaténation Oracle

Bonjour a tous, Une petite astuce en Oracle pour concaténer des lignes sous forme de "Champs" (champ1, champ2...). Il suffit d'utiliser une fonction présent dans les fonctions d'oracle : wmsys.wm_concat avec un group by Comme cela :
select wmsys.wm_concat(libelle) as LIBELLE, max(date_creation) as MA_DATE, CHIFFRE
from maTable
where critere = 1
and critere2 in (1,2,3)
group by CHIFFRE
Le résultat
LIBELLE MA_DATE CHIFFRE
-------- ------------------- ----------
aa,bb,cc 2007-11-19 44000

lundi 21 septembre 2009

SQL et DB2 - Sequence, trigger ...

Quelques exemple de SQL sur DB2

Création de table , sequence, trigger, unique, auto_increment ...
CREATE TABLE WIDGET_INVENT 
  ( ROW_ID INT NOT NULL GENERATED ALWAYS AS IDENTITY 
         (START WITH 1, INCREMENT BY 1, NO CACHE), 
    WIDGET_NO CHAR(6), 
    INV_COUNT INT WITH DEFAULT 0 
  ); 

mercredi 24 juin 2009

Commande et reconfiguration SQL Serveur (Express)

@ECHO OFF
@ECHO =============================================
@ECHO ::: Enabling User Instances
@ECHO =============================================
sqlcmd -S .\SQLExpress -Q "sp_configure 'user instances enabled' , 1;"
@ECHO.
@ECHO =============================================
@ECHO ::: RECONFIGURING
@ECHO =============================================
sqlcmd -S .\SQLExpress -Q "reconfigure;"
@ECHO DONE
@ECHO.
@ECHO =============================================
@ECHO ::: COMPLETED
@ECHO =============================================
PAUSE>NUL