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

Oracle Discussion :

[9i] Performance requete UPDATE + IN


Sujet :

Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Décembre 2002
    Messages
    67
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 67
    Par défaut [9i] Performance requete UPDATE + IN
    Bonjour,
    je travaille sur la requete suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    UPDATE FICHE
    SET    IND_RAPPELECHU = ?
    WHERE  ID_FICHE IN (SELECT F.ID_FICHE
                        FROM   FICHE F,
                               CLIENT C
                        WHERE  F.DATERAPPELPROACTIF < SYSDATE
                               AND (F.ETAT = ?
                                     OR F.ETAT = ?)
                               AND F.ID_PROCESSUS = ?
                               AND F.NUMCLIENT = C.NUMEROCLIENT
                               AND C.ID_CENTRE = ?)
    Ma table FiCHE et ma table CLIENT sont des tables volumineuses pouvant contenir plusieurs millions d'enregistrements.
    Les temps de réponses de cette requete ne sont pas satisfaisants.
    Je cherche à les améliorer.

    Quelqu'un a-t-il de sidées à me soumettre. Je travail sous oracle 9i.

    Merci d'avance

    Mise en forme effectuée par Magnus. Merci d'y penser à l'avenir

  2. #2
    Membre Expert

    Profil pro
    Inscrit en
    Février 2006
    Messages
    3 437
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 3 437
    Par défaut
    Vous pouvez essayer d'activez la trace SQL et d'utiliser tkprof (http://oracle.developpez.com/guide/tuning/tkprof/) pour voir le plan d'exécution. Postez les résultats avec:
    - le DDL de création des tables et des index
    - la façon dont vous calculez les statistiques sur les objets concernés.

  3. #3
    Membre Expert
    Inscrit en
    Avril 2006
    Messages
    1 024
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 1 024
    Par défaut
    Il faut toujours préférer le EXISTS dans ces cas là:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    UPDATE FICHE U
    SET    IND_RAPPELECHU = ?
    WHERE  EXISTS (
           SELECT 1 FROM
                               FICHE F,
                               CLIENT C
                        WHERE  U.IF_FICHE = F.ID_FICHE
                               AND F.DATERAPPELPROACTIF < SYSDATE
                               AND (F.ETAT = ?
                                     OR F.ETAT = ?)
                               AND F.ID_PROCESSUS = ?
                               AND F.NUMCLIENT = C.NUMEROCLIENT
                               AND C.ID_CENTRE = ?)
    voir même:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    UPDATE FICHE U
    SET    IND_RAPPELECHU = ?
    WHERE  EXISTS (
           SELECT 1 FROM
                               FICHE F                           
                        WHERE  U.IF_FICHE = F.ID_FICHE
                               AND F.DATERAPPELPROACTIF < SYSDATE
                               AND (F.ETAT = ? OR F.ETAT = ?)
                               AND F.ID_PROCESSUS = ?
                               AND  EXISTS (
                                    SELECT 1 FROM CLIENT C
                                        WHERE   F.NUMCLIENT = C.NUMEROCLIENT
                                                  AND C.ID_CENTRE = ?)
                              )
    ça c'est pour le principe, ensuite il y a les classique de l'optimisation à savoir:
    - Passer le calcul de stats oracle
    - vérifier que les critères les plus discriminant portent bien sur des colonnes indexées
    - vérifier que les colonne de jointure sont bien indexées.

  4. #4
    Membre Expert

    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2004
    Messages
    2 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 862
    Par défaut
    Citation Envoyé par remi4444
    Il faut toujours préférer le EXISTS dans ces cas là
    Attention à de la généralisation trop hâtive. J'ai vu sur le site de Tom des cas où le in était plus performants :
    http://asktom.oracle.com/pls/ask/f?p...D:953229842074

    Il n'y a pas de règles toutes faites pour optimiser une requête, il n'y a QUE le plan d'éxécution et le tkprof qui permettent de l'optimiser.

  5. #5
    Membre Expert
    Inscrit en
    Avril 2006
    Messages
    1 024
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 1 024
    Par défaut
    J'admet que j'ai dégainé le mot "toujours" un peu vite...
    Ca fait tellement longtemps que je fais une campagne de promotion des "EXISTS" que je m'emporte un peu vite... J'aurais du dire, qu'il faut à priori préferer le EXISTS quand on veux faire du filtrage. Le IN est dangeureux pour moi car il peut masquer des gaspillage ennormes de resources (un produit cartésien par exemple). Mais je suis d'accord avec toi, ce ne sont que des discussions de principe, il faut dans tous les cas s'interresser au plan d'exécution (apres passage de stats) pour compendre ce qui se passe...

    Dommage ton lien ne fonctionne pas, ça m'interresse de savoir quel cas on peut trouvé pour que IN soit meilleur...

  6. #6
    Membre Expert

    Profil pro
    Inscrit en
    Février 2006
    Messages
    3 437
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 3 437
    Par défaut
    Voici un lien sur le sujet qui doit marcher: http://asktom.oracle.com/pls/ask/f?p...A:953229842074

Discussions similaires

  1. accelerer les performances d'une requete update
    Par mattmax dans le forum Requêtes
    Réponses: 1
    Dernier message: 03/11/2011, 09h53
  2. [SYBASE] optimisation requete UPDATE
    Par metheorn dans le forum Sybase
    Réponses: 8
    Dernier message: 24/05/2004, 17h01
  3. [version] Requete Update avec différentes versions de mySQL
    Par regbegpower dans le forum Requêtes
    Réponses: 2
    Dernier message: 26/01/2004, 17h19
  4. Requete update
    Par gianfare dans le forum Langage SQL
    Réponses: 7
    Dernier message: 10/10/2003, 09h04
  5. [debutante] erreur requete update
    Par LineLe dans le forum ASP
    Réponses: 5
    Dernier message: 12/09/2003, 13h05

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