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 :

Performance des requêtes


Sujet :

SQL Oracle

  1. #1
    Membre très actif
    Inscrit en
    Novembre 2008
    Messages
    139
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 139
    Par défaut Performance des requêtes
    Bonjour,

    REQ1:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select * from A,B where A.codea =B.code
    REQ2:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select * from A inner join B on A.codea=B.code
    Y a t-il une différence entre ces deux requêtes du point de vue performance et temps de réponse ?

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

    Informations forums :
    Inscription : Août 2008
    Messages : 2 955
    Par défaut
    Non

  3. #3
    Membre extrêmement actif
    Avatar de islamov2000
    Homme Profil pro
    Ingénieur d'études & developpement en informatique
    Inscrit en
    Septembre 2007
    Messages
    814
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Ingénieur d'études & developpement en informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2007
    Messages : 814
    Billets dans le blog
    6
    Par défaut
    Oui ,il y la difference; sinon pourqoui inventer une nouvelle syntaxe.

  4. #4
    Membre très actif
    Inscrit en
    Novembre 2008
    Messages
    139
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 139
    Par défaut
    OUI/NON, y a t-il un document qui justifie?

  5. #5
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 136
    Par défaut
    Il ne devrait pas y avoir de différence à l'exécution.

    La syntaxe avec INNER JOIN assure la cohérence avec la syntaxe de xxx OUTER JOIN et CROSS JOIN.
    Par ailleurs, elle permet de mettre en évidence les éléments de la jointure et les séparer des conditions de filtrage, rendant la requête plus lisible.

    En corollaire, dans une requête complexe comportant des jointures entre plusieurs tables, l'obligation de préciser la condition de jointure dans la clause ON de l'instruction INNER JOIN évite l'oubli de cette condition et la création de produits cartésiens
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  6. #6
    Membre Expert
    Inscrit en
    Août 2009
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 1 073
    Par défaut
    Citation Envoyé par al1_24 Voir le message
    Il ne devrait pas y avoir de différence à l'exécution.
    À l'exécution, non, mais au parsing ? Je me suis déjà posé la question, et je n'ai pas encore eu le courage de mettre au point un test, ni de rechercher si quelqu'un a eu le courage de le faire

    La syntaxe avec INNER JOIN assure la cohérence avec la syntaxe de xxx OUTER JOIN et CROSS JOIN.
    Par ailleurs, elle permet de mettre en évidence les éléments de la jointure et les séparer des conditions de filtrage, rendant la requête plus lisible.
    Je plussoie totalement ce point (qui explique aussi ma flemme à mettre au point un test : même si le résultat donne un parsing largement en faveur de la jointure "old school", je n'aurais pas envie d'y passer).

  7. #7
    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
    La requête est d'abord transformée et ensuite optimisée.
    Faite une trace de l'evenement 10053
    ...
    SQL:******* UNPARSED QUERY IS *******
    SELECT "D"."DEPARTMENT_ID" "DEPARTMENT_ID","D"."DEPARTMENT_NAME" "DEPARTMENT_NAME","D"."MANAGER_ID" "MANAGER_ID","
    D"."LOCATION_ID" "LOCATION_ID","L"."LOCATION_ID" "LOCATION_ID","L"."STREET_ADDRESS" "STREET_ADDRESS","L"."POSTAL_C
    ODE" "POSTAL_CODE","L"."CITY" "CITY","L"."STATE_PROVINCE" "STATE_PROVINCE","L"."COUNTRY_ID" "COUNTRY_ID" FROM "HR"
    ."DEPARTMENTS" "D","HR"."LOCATIONS" "L" WHERE "D"."LOCATION_ID"="L"."LOCATION_ID"
    ...
    Current SQL statement for this session:
    SELECT *
    FROM hr.departments d
    Join
    hr.locations l
    On d.location_id = l.location_id

  8. #8
    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
    Citation Envoyé par al1_24 Voir le message
    ...
    En corollaire, dans une requête complexe comportant des jointures entre plusieurs tables, l'obligation de préciser la condition de jointure dans la clause ON de l'instruction INNER JOIN évite l'oubli de cette condition et la création de produits cartésiens
    Je peur que elle n'evite rien. Voilà un exemple limite.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT *  
      FROM hr.departments d 
           Join
           hr.locations l 
        On 1 = 1

  9. #9
    Rédacteur

    Homme Profil pro
    Consultant / formateur Oracle et SQL Server
    Inscrit en
    Décembre 2002
    Messages
    3 462
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Consultant / formateur Oracle et SQL Server

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 462
    Par défaut
    Citation Envoyé par mnitu Voir le message
    Je peur que elle n'evite rien. Voilà un exemple limite.
    ...
    Mouais... Il y a une différence entre oublier une condition et mettre volontairement une condition stupide !

  10. #10
    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
    @Pomalaix
    Pensez aux jointures multi-colonnes, où rien ne vous empêche d’oublier une condition. Voir aussi non equijoins.

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

    Informations forums :
    Inscription : Août 2008
    Messages : 2 955
    Par défaut
    Citation Envoyé par Pomalaix Voir le message
    Mouais... Il y a une différence entre oublier une condition et mettre volontairement une condition stupide !
    Y a quand même moyen de se planter sur les conditions de jointure et faire un produit cartésien :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT *  
      FROM hr.departments d 
      JOIN hr.locations l 
        ON l.location_id = l.location_id
    Le gros avantage de la syntaxe ANSI c'est lorsqu'un développeur veut faire un produit cartésien, il utilise CROSS JOIN qui est explicite et donc nettement plus maintenable.

  12. #12
    Membre très actif
    Inscrit en
    Novembre 2008
    Messages
    139
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 139
    Par défaut
    malheureusement, personne a une réponse convaincante accompagnée d'un document!!!

  13. #13
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2009
    Messages
    186
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2009
    Messages : 186
    Par défaut
    Pas de réponse convaincante, mais bon, voici la mienne, qui s'éloigne un peu du domaine de performances mais qui est à prendre en compte lorsque l'on travaille sur des bases conséquentes :

    Je n'ai jamais constaté de différence entre les deux syntaxes à un niveau de requête assez standard (jointures sur 2 ou 3 tables).

    Cependant, si tu penses à la lisibilité du code et a la maintenabilité, c'est plus facile de faire évoluer des jointures en INNER, OUTER, ...

    Pourquoi ? Tout simplement parce que l'on sait directement ou rajouter les conditions de jointures des conditions de filtrage. Si jamais je dois reprendre une requête complexe, j'ose espérer qu'elle n'est pas en jointure WHERE, qui va mélanger les deux conditions et complexifier le tout...

    Pour la "preuve" par document, je t'invite à lire tout ceci et les liens généraux qui en découlent. Bonne lecture !
    http://www.developpez.net/forums/d63...tre-jointures/

  14. #14
    Membre Expert Avatar de ojo77
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Décembre 2010
    Messages
    680
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Décembre 2010
    Messages : 680
    Par défaut
    Citation Envoyé par haykelFST Voir le message
    Y a t-il une différence entre ces deux requêtes du point de vue performance et temps de réponse ?
    Non,

    Pour vous en convaincre testez un explain plan avec les deux syntaxes en effectuant une trace 10053.

    Vous verrez qu'oracle réécrit les jointures ANSI comme des jointures non ANSI (en prédicat).

  15. #15
    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
    Citation Envoyé par haykelFST Voir le message
    malheureusement, personne a une réponse convaincante accompagnée d'un document!!!
    Que voulez-vous de plus convaincante que la trace de l’optimiseur montrant la réécriture de la requête en format non-ANSI ?

  16. #16
    Membre extrêmement actif
    Avatar de islamov2000
    Homme Profil pro
    Ingénieur d'études & developpement en informatique
    Inscrit en
    Septembre 2007
    Messages
    814
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Ingénieur d'études & developpement en informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2007
    Messages : 814
    Billets dans le blog
    6
    Par défaut
    Citation Envoyé par haykelFST Voir le message
    malheureusement, personne a une réponse convaincante accompagnée d'un document!!!

    Moi, j'ai dit oui, mais pourquoi?

    REQ1:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select * from t1,t2 where t1.a=t2.b
    Avant que la requete projecte le resultat en vérifiant la condition, elle fait un produit cartésien. donc la condition vient apres la jointure(produit cartésien).

    Par contre, la requete REQ2
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select * from t1 join t2 on t1.a=t2.b
    , elle ne peut pas etre executé sans verifier la condition de jointure. Cette derniere (condition) est une part de la syntaxe de jointure.

  17. #17
    Membre Expert
    Inscrit en
    Août 2009
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 1 073
    Par défaut
    Citation Envoyé par islamov2000 Voir le message
    Moi, j'ai dit oui, mais pourquoi?

    REQ1:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select * from t1,t2 where t1.a=t2.b
    Avant que la requete projecte le resultat en vérifiant la condition, elle fait un produit cartésien. donc la condition vient apres la jointure(produit cartésien).

    Par contre, la requete REQ2
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select * from t1 join t2 on t1.a=t2.b
    , elle ne peut pas etre executé sans verifier la condition de jointure. Cette derniere (condition) est une part de la syntaxe de jointure.
    Malheureusement pour vous, et heureusement pour nous, le moteur d'Oracle ne fait pas stupidement un produit cartésien avant de restreindre les lignes en fonction des jointures (sauf probablement s'il estime qu'il peut le faire, avec des cardinalités très faibles) ; d'ailleurs si tel était le cas, les requêtes écrites en mode "traditionnel" (par opposition à ANSI) auraient des performances tellement catastrophiques que personne ne pourrait les utiliser (concrètement, ça signifierait l'abandon de la compatibilité).
    On en revient toujours au même point : faites l'essai, comparez les plans d'exécution.
    La seule question qui me reste concerne le temps de parsing de la requête, ce qui est dans la très grande majorité des cas complètement anecdotique, mais pourrait intéressant dans certains contextes spécifiques de requêtages massifs et non bindés.

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

    Informations forums :
    Inscription : Août 2008
    Messages : 2 955
    Par défaut
    Citation Envoyé par islamov2000 Voir le message
    Moi, j'ai dit oui, mais pourquoi?
    On peut se tromper, on peut croire quelque chose qui n'est pas vrai, mais l'intérêt de participer sur un forum c'est que même sans poser de question on en apprend tous les jours.

    Par contre maintenir une affirmation fausse alors que certains messages permettent d'avoir la bonne démarche pour analyser et comprendre le phénomène, c'est pas très pro.
    Citation Envoyé par mnitu Voir le message
    La requête est d'abord transformée et ensuite optimisée.
    Faite une trace de l'evenement 10053
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    ...
    SQL:******* UNPARSED QUERY IS *******
    SELECT "D"."DEPARTMENT_ID" "DEPARTMENT_ID","D"."DEPARTMENT_NAME" "DEPARTMENT_NAME","D"."MANAGER_ID" "MANAGER_ID","
    D"."LOCATION_ID" "LOCATION_ID","L"."LOCATION_ID" "LOCATION_ID","L"."STREET_ADDRESS" "STREET_ADDRESS","L"."POSTAL_C
    ODE" "POSTAL_CODE","L"."CITY" "CITY","L"."STATE_PROVINCE" "STATE_PROVINCE","L"."COUNTRY_ID" "COUNTRY_ID" FROM "HR"
    ."DEPARTMENTS" "D","HR"."LOCATIONS" "L" WHERE "D"."LOCATION_ID"="L"."LOCATION_ID"
    ...
    Current SQL statement for this session:
    SELECT *
    FROM hr.departments d
    Join
    hr.locations l
    On d.location_id = l.location_id
    [edit] Pour info c'est le forum oracle, les réponses ne concernent donc qu'oracle, d'autres SGBDR peuvent fonctionner différemment.

  19. #19
    Membre extrêmement actif
    Avatar de islamov2000
    Homme Profil pro
    Ingénieur d'études & developpement en informatique
    Inscrit en
    Septembre 2007
    Messages
    814
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Ingénieur d'études & developpement en informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2007
    Messages : 814
    Billets dans le blog
    6
    Par défaut
    Citation Envoyé par skuatamad Voir le message
    On peut se tromper, on peut croire quelque chose qui n'est pas vrai, mais l'intérêt de participer sur un forum c'est que même sans poser de question on en apprend tous les jours.

    Par contre maintenir une affirmation fausse alors que certains messages permettent d'avoir la bonne démarche pour analyser et comprendre le phénomène, c'est pas très pro.

    [edit] Pour info c'est le forum oracle, les réponses ne concernent donc qu'oracle, d'autres SGBDR peuvent fonctionner différemment.
    Tu as raison skuatamad, meme moi,je suis là pour apprendre et faire apprendre.
    C'etait mon analyse; la preuve que personne a fournie une docamentation qui prouve l'avis de chaque'un d'antre nous.

    Citation Envoyé par skuatamad Voir le message
    [edit] Pour info c'est le forum oracle, les réponses ne concernent donc qu'oracle, d'autres SGBDR peuvent fonctionner différemment.
    Moi je n'ai pas pensé seulement Oracle, j'ai penser aus autres SGBD. je sais bien que Oracle a son propre optimiseur de SQL et il trace son plan d'execution.

  20. #20
    Expert confirmé
    Avatar de pachot
    Homme Profil pro
    Developer Advocate YugabyteDB
    Inscrit en
    Novembre 2007
    Messages
    1 822
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : Suisse

    Informations professionnelles :
    Activité : Developer Advocate YugabyteDB
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2007
    Messages : 1 822
    Billets dans le blog
    1
    Par défaut
    Bonjour,

    Citation Envoyé par haykelFST Voir le message
    malheureusement, personne a une réponse convaincante accompagnée d'un document!!!
    Et voilà, la doc Oracle qui recommande fortement la syntaxe ANSI: Oracle strongly recommends that you use the more flexible FROM clause join syntax shown in the former example.

    Ce n'est pas une question de performance. Mais si elle est recommandée par l'éditeur, c'est là qu'il y aura le moins de bugs.

    Cordialement,
    Franck.

Discussions similaires

  1. Mesurer les performances des requêtes Sybase
    Par kenji_getpowered dans le forum Sybase
    Réponses: 0
    Dernier message: 28/09/2011, 17h39
  2. CONSTRAINT FOREIGN KEY et Performance des requêtes
    Par zinzineti dans le forum Administration
    Réponses: 0
    Dernier message: 28/10/2010, 12h27
  3. [AC-2007] ADP sous 2007: performance des requêtes SET FMTONLY
    Par Mafix dans le forum Projets ADP
    Réponses: 7
    Dernier message: 28/05/2010, 14h34
  4. Performance des requêtes - jointure par fonctions
    Par denevers dans le forum PostgreSQL
    Réponses: 0
    Dernier message: 07/12/2007, 15h11

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