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 :

Jointure et lenteur


Sujet :

SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Ingénieur Concepteur Développeur - Expert SIG
    Inscrit en
    Juin 2012
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Ingénieur Concepteur Développeur - Expert SIG
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2012
    Messages : 29
    Par défaut Jointure et lenteur
    Bonjour,

    J'ai une requête très simple qui me permet de récupérer des données sur la 3eme table de la requête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    select C.Coordinate_GUID
    from Event_range E
    left join Station_Point S on S.Station_GUID between E.Station_GUID_Begin and E.Station_GUID_End
    inner join Coordinate C on C.Location_GUID=S.Location_GUID
    where E.Event_GUID='02A06EEXP005846301-0001';
    Les champs des jointures sont des char(38). Ils ont des indexes de définis.
    La table 'station_point' à 7 230 000 enregistrements.
    La table 'coordinate' à 2 225 000 enregistrements.

    Il faut de 12 à 25 secondes (suivant la charge) pour récupérer les 6 lignes !

    Quel est le problème de cette lenteur ?
    Index défectueux?
    Couple between/inner join ? Avec juste un égal (S.Station_GUID = E.Station_GUID_Begin), le temps est bon.

  2. #2
    Membre expérimenté
    Avatar de ora_home
    Homme Profil pro
    Consultant Oracle
    Inscrit en
    Février 2009
    Messages
    103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Consultant Oracle
    Secteur : Finance

    Informations forums :
    Inscription : Février 2009
    Messages : 103
    Par défaut
    tu peux nous afficher le plan d'exécution de cette requête pour mieux te servir.

  3. #3
    Expert confirmé Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Par défaut
    Quelle est votre version d'Oracle ?
    A quoi sert la jointure externe dans votre requête ?

  4. #4
    Membre averti
    Homme Profil pro
    Ingénieur Concepteur Développeur - Expert SIG
    Inscrit en
    Juin 2012
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Ingénieur Concepteur Développeur - Expert SIG
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2012
    Messages : 29
    Par défaut
    Citation Envoyé par mnitu Voir le message
    Quelle est votre version d'Oracle ?
    A quoi sert la jointure externe dans votre requête ?
    Oracle 10. Mais j'ai une base test avec Oracle 11, et le résultat est le même.

    Voila un peu la structure :

    Tables des objets (plusieurs tables existent)
    |1
    |1
    Table d'évènement
    |1
    |n
    Tables de gestion des coordonnées
    |1
    |1
    Table des coordonnées.

  5. #5
    Membre averti
    Homme Profil pro
    Ingénieur Concepteur Développeur - Expert SIG
    Inscrit en
    Juin 2012
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Ingénieur Concepteur Développeur - Expert SIG
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2012
    Messages : 29
    Par défaut
    Citation Envoyé par ora_home Voir le message
    tu peux nous afficher le plan d'exécution de cette requête pour mieux te servir.
    Voila une copie d'écran du plan d'éxécution tel que le donne SQL Developer.
    Images attachées Images attachées  

  6. #6
    Membre averti
    Homme Profil pro
    Ingénieur Concepteur Développeur - Expert SIG
    Inscrit en
    Juin 2012
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Ingénieur Concepteur Développeur - Expert SIG
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2012
    Messages : 29
    Par défaut
    En modifiant ma requête de cette manière (la racine des GUID est identique sur toutes les tables pour un évènement) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    select C.Coordinate_GUID from Event_range E
    left join Station_Point S on S.Station_GUID like '02A06EEXP005846301-0001%'
    inner join Coordinate C on C.Location_GUID=S.Location_GUID
    where E.Event_GUID='02A06EEXP005846301-0001';
    J'ai un temps inférieur ou égal à 0.1 sec.

    Donc le between n'est vraiment pas l'idéal.
    On dirait qu'il ne tient pas compte des index.

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

    Informations forums :
    Inscription : Août 2008
    Messages : 2 954
    Par défaut
    La jointure externe est inutile.
    Comme seule des données de la 3eme table sont remontées, je passerais plutôt par un test d'existance.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT C.Coordinate_GUID
      FROM Coordinate C
     where exists (select 1
                     from Event_range E
                     JOIN Station_Point S ON S.Station_GUID BETWEEN E.Station_GUID_Begin AND E.Station_GUID_End
                    WHERE E.Event_GUID = '02A06EEXP005846301-0001'
                      and S.Location_GUID = C.Location_GUID)
    Comment sont définis les index sur les tables.

    Le between peut être problématique, regarde Tuning "BETWEEN" Queries

  8. #8
    Membre averti
    Homme Profil pro
    Ingénieur Concepteur Développeur - Expert SIG
    Inscrit en
    Juin 2012
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Ingénieur Concepteur Développeur - Expert SIG
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2012
    Messages : 29
    Par défaut
    Citation Envoyé par skuatamad Voir le message
    La jointure externe est inutile.
    Comme seule des données de la 3eme table sont remontées, je passerais plutôt par un test d'existance.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT C.Coordinate_GUID
      FROM Coordinate C
     where exists (select 1
                     from Event_range E
                     JOIN Station_Point S ON S.Station_GUID BETWEEN E.Station_GUID_Begin AND E.Station_GUID_End
                    WHERE E.Event_GUID = '02A06EEXP005846301-0001'
                      and S.Location_GUID = C.Location_GUID)
    Comment sont définis les index sur les tables.

    Le between peut être problématique, regarde Tuning "BETWEEN" Queries
    En effet, le 'between' est bien le problème !
    Je vais modifier mes requêtes, et regarder si il est possible de "tuner" le 'between' en regardant sur le site indiqué.

    Merci.

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

Discussions similaires

  1. Jointure qui ne renvoie pas tous les enregistrements
    Par rayonx dans le forum Langage SQL
    Réponses: 12
    Dernier message: 19/07/2024, 09h33
  2. Lenteur sur une requête avec jointure
    Par mister3957 dans le forum SQL
    Réponses: 16
    Dernier message: 13/08/2008, 13h10
  3. requetes avec jointures provoquant lenteur
    Par glood1 dans le forum SQL
    Réponses: 9
    Dernier message: 27/03/2008, 13h31
  4. Lenteur d'execution de Jbuilder 6
    Par Tsimplice dans le forum JBuilder
    Réponses: 6
    Dernier message: 18/12/2002, 14h41
  5. Jointures INNER et jointures classiques ???
    Par UbiK dans le forum Langage SQL
    Réponses: 3
    Dernier message: 05/09/2002, 10h29

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