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 :

Requête SQL avec un mauvais plan d'exécution sous Oracle 10G


Sujet :

SQL Oracle

  1. #1
    Nouveau Candidat au Club
    Inscrit en
    Mars 2009
    Messages
    1
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 1
    Points : 1
    Points
    1
    Par défaut Requête SQL avec un mauvais plan d'exécution sous Oracle 10G
    Bonjour,

    Nous venons de migrer une base de données d'Oracle 9i vers Oracle 10g.

    Nous avons identifié une requête qui mettait 30s à s'exécuter sous Oracle 9i et qui met maintenant 20 minutes sous Oracle 10g.

    Voici la requête en question :

    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
    20
    SELECT 
       DISTINCT 
           49, a.id, b.id, 0,0,1 FROM ct_account a, ct_0000_ga1 b, ct_0000_0dplcr c where  b.id not in (select c1.ct_0000_origa from ct_0000_0dplcr c1 where 
                                    a.id = c1.ct_0000_origsa )
    and b.id not in (select c2.ct_0000_origa from ct_0000_0dplcr c2 where 
                           c2.ct_0000_origsa = (select id from ct_account where name='NA') and c2.ct_0000_orisequence = (select ct_0000_sequence from ct_account where id=a.id)
    )
    ;
     
    J'ai cru que le problème venait de l'utilisation de l'opérateur "not in", j'ai donc réécrit la requête avec un opérateur "not exists" comme cela :
     
    INSERT
      INTO [FUNCTION_TABLE]
          ( fncode, fnarg1, fnarg2, fnarg3, fnarg4, fnvalue ) SELECT 
       DISTINCT 
           [FUNCTION_CODE], a.id, b.id, 0,0,1 FROM ct_account a, ct_0000_ga1 b, ct_0000_0dplcr c where  not exists (select * from ct_0000_0dplcr c1 where 
                                    a.id = c1.ct_0000_origsa and b.id = c1.ct_0000_origa )
    and not exists (select * from ct_0000_0dplcr c2 where 
                           c2.ct_0000_origsa = (select id from ct_account where name='NA') and c2.ct_0000_orisequence = (select ct_0000_sequence from ct_account where id=a.id) and b.id = c2.ct_0000_origa 
    )
    Malheureusement les plans d'exécutions sont toujours mauvais sour Oracle 10g.

    Avez vous une idée sur ce problème ou une piste de réécriture de ce code SQL pour quelle soit optimisée sous Oracle 10g?

    Merci d'avance

    David

  2. #2
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 947
    Points : 5 846
    Points
    5 846
    Par défaut
    En reformattant un peu la requete initiale on voit qu'il manque les jointures entre les table a,b,c.
    Sans produits cartésiens je pense que ça ira déjà mieux, et qui sait le DISTINCT deviendra peut être inutil.

    En tout cas rien à voir avec un problème 9i/10g

Discussions similaires

  1. Exécuter une requête SQL avec Hibernate Interceptor
    Par top007 dans le forum Hibernate
    Réponses: 0
    Dernier message: 13/08/2014, 11h47
  2. Problème exécution requête SQL avec HSQLDB
    Par montis dans le forum JDBC
    Réponses: 1
    Dernier message: 23/03/2012, 09h37
  3. Réponses: 8
    Dernier message: 05/03/2012, 15h36
  4. Exécuter des requête SQL (avec ou sans PHP) dans javascript
    Par mir540 dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 20/11/2009, 10h03
  5. PB requète SQL avec Interbase
    Par missllyss dans le forum InterBase
    Réponses: 2
    Dernier message: 15/07/2003, 11h37

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