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

Langage SQL Discussion :

Select lent voire impossible


Sujet :

Langage SQL

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 13
    Points : 11
    Points
    11
    Par défaut Select lent voire impossible
    Bonjour à tous,

    j'ai une interrogation car entre deux requêtes similaires sur la même base de données (de type ORACLE), le temps de réponse est pour l'une très court et pour l'autre très long voir impossible (time out).

    La requête qui fonctionne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    SELECT ENCOURS_PLM_REAL.PLM_NUM, ENCOURS_PLM_REAL.TPL_COD, ENCOURS_SITE.SIT_LIB, ENCOURS_COMMUNE.COM_LIB, ENCOURS_PLM_REAL.PLM_PNT, ENCOURS_PLM_REAL.PLM_DSC
    FROM ENCOURS_RESULTAT 
            INNER JOIN ((ENCOURS_PLM_REAL INNER JOIN ENCOURS_COMMUNE ON ENCOURS_PLM_REAL.COM_COD = ENCOURS_COMMUNE.COM_COD) 
            INNER JOIN ENCOURS_SITE ON ENCOURS_PLM_REAL.SIT_COD = ENCOURS_SITE.SIT_COD) ON ENCOURS_RESULTAT.PLM_NUM = ENCOURS_PLM_REAL.PLM_NUM
    WHERE (((Exists (select 'x' from ENCOURS_RESULTAT where ENCOURS_RESULTAT.PLM_NUM = ENCOURS_PLM_REAL.PLM_NUM and ENCOURS_RESULTAT.ELE_COD = "3H" and ENCOURS_RESULTAT.RES_VAL is null))=False) 
            AND ((ENCOURS_RESULTAT.ELE_COD)="HTO" Or (ENCOURS_RESULTAT.ELE_COD)="HT") AND ((ENCOURS_RESULTAT.RES_VAL) Is Null))
            GROUP BY ENCOURS_PLM_REAL.PLM_NUM, ENCOURS_PLM_REAL.TPL_COD, ENCOURS_SITE.SIT_LIB, ENCOURS_COMMUNE.COM_LIB, ENCOURS_PLM_REAL.PLM_PNT, ENCOURS_PLM_REAL.PLM_DSC, ENCOURS_PLM_REAL.MOD_COD
            HAVING (((ENCOURS_PLM_REAL.MOD_COD)="E0184"));
    Celle qui met plusieurs secondes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    SELECT ENCOURS_PLM_REAL.PLM_NUM, ENCOURS_PLM_REAL.TPL_COD, ENCOURS_PLM_REAL.SIT_COD, ENCOURS_PLM_REAL.PLM_DSC
    FROM ENCOURS_ANA_REAL INNER JOIN ENCOURS_PLM_REAL ON ENCOURS_ANA_REAL.PLM_NUM = ENCOURS_PLM_REAL.PLM_NUM
    WHERE (((ENCOURS_PLM_REAL.TPL_COD)="ANI" Or (ENCOURS_PLM_REAL.TPL_COD)="AL" Or (ENCOURS_PLM_REAL.TPL_COD)="PLA" Or (ENCOURS_PLM_REAL.TPL_COD)="BV" 
            Or (ENCOURS_PLM_REAL.TPL_COD)="CR" Or (ENCOURS_PLM_REAL.TPL_COD)="FAQ" Or (ENCOURS_PLM_REAL.TPL_COD)="LD" Or (ENCOURS_PLM_REAL.TPL_COD)="LN" 
            Or (ENCOURS_PLM_REAL.TPL_COD)="SL" Or (ENCOURS_PLM_REAL.TPL_COD)="SED" Or (ENCOURS_PLM_REAL.TPL_COD)="V") AND ((ENCOURS_PLM_REAL.PLM_STA)="E") 
            AND ((Exists (select 'x' from ENCOURS_ANA_REAL where ENCOURS_ANA_REAL.PLM_NUM = ENCOURS_PLM_REAL.PLM_NUM and ENCOURS_ANA_REAL.ANR_DEB is null and ENCOURS_ANA_REAL.ANR_FIN is null))=False));
    Et si j'ajoute un critère sur l'un des champs, la requête ne passe plus du tout.

    Une idée ?

    Merci d'avance

    Rémi

  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
    A part l'utilisation de la table ENCOURS_PLM_REAL, en quoi ces requêtes sont elles similaires.
    EXISTS = false ne compile pas sur oracle.

    Vu le nombre de parenthèse et l'écriture folklorique, j'espère que la requête est générée par outil

    Sinon pour les problèmes de perfs, c'est toujours la même approche : plan d'exécution, trace...

  3. #3
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 032
    Points
    34 032
    Billets dans le blog
    14
    Par défaut
    C'est plutôt bizarre d'imbriquer les JOIN ! On dirait une requête générée par Access !

    Par ailleurs...
    1) Un code indenté et aéré est plus agréable à lire et à débugguer.
    2) L'utilisation d'alias pour les tables est fortement recommandé dès qu'il y a plus d'une table dans la requête. Cela facilite l'écriture et la lecture de celle-ci. Il faut ensuite utiliser systématiquement ces alias devant chaque colonne nommée pour savoir facilement de quelle table elle vient.

    Comme l'a suggéré skuatamad, première chose à examiner quand on a des problèmes de performances : les index !
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Ingénieur d'Etude Mainframe/AS400
    Inscrit en
    Novembre 2012
    Messages
    1 767
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur d'Etude Mainframe/AS400
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2012
    Messages : 1 767
    Points : 10 765
    Points
    10 765
    Par défaut
    Je plussoie ce qui a été dit ci-dessus. Et effectivement, le premier point à regarder ce sont les Index.

Discussions similaires

  1. SELECT lent en InnoDB
    Par guizmo_ dans le forum Requêtes
    Réponses: 9
    Dernier message: 20/05/2008, 10h32
  2. Requete préparé et la selection des champs - impossible.
    Par berceker united dans le forum Requêtes
    Réponses: 1
    Dernier message: 26/09/2007, 16h31
  3. [DB2]select compliqué ou impossible ?
    Par xavrdtp dans le forum Langage SQL
    Réponses: 4
    Dernier message: 11/09/2006, 16h34
  4. [Oracle 10g]INSERT SELECT lent
    Par Giill dans le forum Oracle
    Réponses: 2
    Dernier message: 22/05/2006, 17h18
  5. Requete difficile à concevoir, voire impossible
    Par zarbiman dans le forum Langage SQL
    Réponses: 2
    Dernier message: 25/07/2005, 18h48

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