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 :

Optimisation de requête


Sujet :

Langage SQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Juin 2007
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 47
    Par défaut Optimisation de requête
    Bonjour,

    J'ai une requête SQL qui est beaucoup trop longue à l'execution.
    plus de 5 mn !!.
    En fait, je cherche à retourner le voisinage proche des maisons en comparant leurs coordonnées.
    On considére proche, les maisons qui se trouvent à plus ou moins 100 mètres les unes des autres.

    Voici le requête :
    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
    21
    22
    23
    24
    SELECT  DISTINCT
                          S1.KEY, 
                          S1.nom_maison, 
                          S1.code_maison, 
                          S1.code_empl, 
                          S1.X, 
                          S1.Y, 
                          null  groupe_0, 
                          S1.code_n,
                          T.ABBREV type
    FROM   maison S1,
           maison S2,
           no  N,
           type T
    WHERE   S1.key <> S2.key 
    AND     S1.x > (S2.x-100)
    AND     S1.x < (S2.x+100) 
    AND     S1.y > (S2.y-100)
    AND     S1.y < (S2.y+100)
    AND     S1.code_n <> S2.code_n
    AND     S1.code_n = N.nod_n
    AND     N.typ_key = T.typ_key
    AND     N.typ_key IN (1, 2, 6, 37, 114);
    La partie qui pose à priori problème, est celle en rouge dans le code.
    J'avoue que j'accepterais bien un peu d'aide.

  2. #2
    Membre émérite Avatar de Mathusalem
    Profil pro
    IT moa
    Inscrit en
    Décembre 2003
    Messages
    1 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : IT moa

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 008
    Par défaut
    pour l'optimisation je ne sais pas trop, à part faire des jointures en inner join, par contre me semble incorrect, tu auras tout en double inversé

    mets plutôt



    edit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    S1.x > (S2.x-100)
    AND     S1.x < (S2.x+100)
    irait peut-être plus vite comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    S1.x between  S2.x-100 and S2.x+100

  3. #3
    Membre averti
    Inscrit en
    Juin 2007
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 47
    Par défaut
    Merci de ta réponse.
    J'ai déjà utilisé ce que tu proposes mais rien n'y fait.
    Je précise que cette même requête fonctionne normalement sur Sql Server (2s), par contre sur Oracle, c'est très long.
    Penses-tu que c'est un problème d'optimiseur ?

  4. #4
    Membre émérite Avatar de Mathusalem
    Profil pro
    IT moa
    Inscrit en
    Décembre 2003
    Messages
    1 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : IT moa

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 008
    Par défaut
    la question qui suit est : as-tu des index sur tes tables ?

    Pour les questions pointues d'optimisation, je ne sais pas répondre désolé.

  5. #5
    Membre averti
    Inscrit en
    Juin 2007
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 47
    Par défaut
    Sur la table maison, pas d'index. Uniquement la clé primaire : KEY
    J'ai tenté d'en mettre 1 pour X et 1 pour Y mais pas d'amélioration en temps d'execution.

  6. #6
    Membre émérite Avatar de Mathusalem
    Profil pro
    IT moa
    Inscrit en
    Décembre 2003
    Messages
    1 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : IT moa

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 008
    Par défaut
    vire le distinct maintenant qu'on a plus de pb de doublons



    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  
    	S1.KEY, 
    	S1.nom_maison, 
    	S1.code_maison, 
    	S1.code_empl, 
    	S1.X, 
    	S1.Y, 
    	null  groupe_0, 
    	S1.code_n,
    	T.ABBREV type
    FROM   maison S1
    inner join maison S2
    	on S1.key > S2.key  
    	and S1.x between (S2.x-100) and (S2.x+100)
    	and S1.y between (S2.y-100) and (S2.y+100)
    inner join no  N
    	on S1.code_n = N.nod_n
    inner join type T
            on N.typ_key = T.typ_key
    WHERE  N.typ_key IN (1, 2, 6, 37, 114)

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

Discussions similaires

  1. [Access] Optimisation performance requête - Index
    Par fdraven dans le forum Access
    Réponses: 11
    Dernier message: 12/08/2005, 14h30
  2. Optimisation de requête avec Tkprof
    Par stingrayjo dans le forum Oracle
    Réponses: 3
    Dernier message: 04/07/2005, 09h50
  3. 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
  4. optimisation des requêtes
    Par yech dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 21/09/2004, 19h03
  5. Optimisation de requête
    Par olivierN dans le forum SQL
    Réponses: 10
    Dernier message: 16/12/2003, 10h09

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