IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

SQL Oracle Discussion :

[10g] Optimiser une requête


Sujet :

SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 28
    Par défaut Optimiser une requête - Oracle10g
    J'ai créé un infocentre que je charge à partir de données provenant d'une autre base (isiparc).
    Le script est fait de manière à mettre à jour toutes les données déjà chargées et d'insérer les données nouvelles.
    Il fonctionne mais le temps de chargement n'est pas terrible.

    Voici ma trame de code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    UPDATE  tblcible
    SET     col1 = (select col1 from tblsource@isiparc where id = tblsource.id )
        ,   coln = (select coln from tblsource@isiparc where id = tblsource.id )
    ;
    INSERT INTO tblcible
        (   id
        ,   col1
        ,   coln
        )
    SELECT  src.id
        ,   src.col1
        ,   src.coln
    FROM    tblsource@isiparc   AS src
    WHERE   NOT EXISTS
            (   SELECT  1
                FROM    tblcible    AS cbl
                WHERE   cbl.id = src.id 
            )
    ;
    Voilà, c'est surtout le update qui rend le temps de chargement long à mon avis, avez-vous des solutions à me proposer pour améliorer la rapidité d'exécution?

    Merci d'avance

  2. #2
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944

  3. #3
    Membre Expert Avatar de Garuda
    Homme Profil pro
    Chef de projet / Urbaniste SI
    Inscrit en
    Juin 2007
    Messages
    1 285
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet / Urbaniste SI
    Secteur : Bâtiment

    Informations forums :
    Inscription : Juin 2007
    Messages : 1 285
    Par défaut
    Sans garantie, il me semble avoir déja fait un truc dans le genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    UPDATE  tblcible
    SET     (col1,coln) = (SELECT col1,coln FROM tblsource@isiparc WHERE id = tblsource.id )
    
    ;

  4. #4
    Rédacteur

    Homme Profil pro
    Développeur et DBA Oracle
    Inscrit en
    Octobre 2006
    Messages
    878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur et DBA Oracle

    Informations forums :
    Inscription : Octobre 2006
    Messages : 878
    Par défaut
    Salut,
    Est ce que tu as un trigger after ou before update sur ta table ?

    Peut être l'index qui pose problème ?

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 28
    Par défaut
    Merci pour vos pistes,

    Garuda, ta méthode fonctionne et m'a permis de simplifier la syntaxe

    Ensuite j'ai essayé de regarder le merge, j'ai pris exemple sur le cours du site : http://oracle.developpez.com/faq/?page=3-1#merge

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    MERGE INTO utilisateur T1
    	USING (SELECT U.C_UTIL,decode(U.N_UTIL,NULL,'(VIDE)',U.N_UTIL),decode(U.N_UTIL,NULL,'(VIDE)',U.N_UTIL),F.L_FONCTION FROM utilisateur@isiparc U,fonction@isiparc F WHERE U.C_FONCTION=F.C_FONCTION(+)) T2
    		ON (T1.id_util = T2.C_UTIL)
    WHEN MATCHED THEN
    	UPDATE SET (T1.nom_util,T1.prenom_util,T1.libelle_fonction) = (decode(T2.N_UTIL,NULL,'(VIDE)',T2.N_UTIL),decode(T2.N_UTIL,NULL,'(VIDE)',T2.N_UTIL),T2.L_FONCTION)
    WHEN NOT MATCHED THEN
    	INSERT (T1.id_util,T1.nom_util,T1.prenom_util,T1.libelle_fonction) VALUES (T2.C_UTIL,decode(T2.N_UTIL,NULL,'(VIDE)',T2.N_UTIL),decode(T2.N_UTIL,NULL,'(VIDE)',T2.N_UTIL),T2.L_FONCTION)
    ;
    Hors j'ai une erreur :
    ORA-01747: invalid user.table.column, table.column, or column specification

    Je n'arrive pas à résoudre cette erreur, pouvez-vous m'aider?

    PS : j'ai vu que le tutoriel était pour oracle 9i, serait-ce ça?

  6. #6
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    MERGE INTO tblcible c
    using tblsource@isiparc s
    on (c.id=s.id)
    when matched then
    update SET col1 = s.col1,
     coln=s.coln
    where 
      c.col1 != s.col1 or (c.col1 is null and s.col1 is not null) or (c.col1 is not null and s.col1 is null)
      or
      c.coln != s.coln or (c.coln is null and s.coln is not null) or (c.coln is not null and s.coln is null)
    when not matched then
    INSERT (id,col1,coln) values (s.id,s.col1,s.coln)

    note la where clause, c'est du tuning!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Optimiser une requête de "classement"
    Par Manu0086 dans le forum Requêtes
    Réponses: 7
    Dernier message: 09/03/2006, 18h47
  2. besoin d'aide pour optimiser une requête
    Par jisse dans le forum Langage SQL
    Réponses: 4
    Dernier message: 27/01/2006, 09h41
  3. Optimiser une requête..est-ce possible ?
    Par Thierry8 dans le forum Langage SQL
    Réponses: 9
    Dernier message: 27/09/2005, 11h31
  4. Optimiser une requête SQL d'un moteur de recherche
    Par kibodio dans le forum Langage SQL
    Réponses: 2
    Dernier message: 06/03/2005, 20h55

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo