|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||||||
|
Membre actif
![]() Inscription : février 2008 Messages : 455 ![]() |
Bonjour à tous,
J'ai testé deux requêtes qui donnent le même résultat et j'ai été pas mal surpris du résultat obtenu ! Voici les requêtes : Code :
Code :
Code :
La deuxième requête me semblait plus propre.. Qu'en pensez-vous ? Merci d'avance |
||||||
|
|
00
|
|
|
#2 | ||||
|
Membre confirmé
![]() Grégoire MARTINIngénieur développement logiciels Inscription : janvier 2011 Messages : 128 ![]() |
Bonjour,
tes requêtes ne sont pas ISO. Si elles ramènent le même nombre de lignes c'est qu'il doit y avoir une relation 1..1 entre tes 2 tables . Code :
L’équivalent serait plutôt Code :
Dans le 1e cela doit etre une Nested loop en passant par des indexs. La deuxieme du fait que c'est une jointure ouverte, oracle doit pouvoir gerer le fait qu'il n'y a pas de match entre les 2 tables, pour ce faire il commence par fetcher les 2 tables en memoire puis il travail en hash join ( regarde le coup CPU qui explose ) ce type de jointure est assez efficace lorsque tu croises 2 grosses volumetries. Cordialement. |
||||
|
|
00
|
|
|
#3 | ||
|
Expert Confirmé Sénior
![]() ![]() Marius NituIngénieur développement logiciels Inscription : octobre 2007 Messages : 3 311 ![]() |
Votre deuxième requête c'est un peu n'importe quoi donc il ne faut pas s'étonner que ça prends du temps
Code :
Une sous-requête scalaire se remplace par un outer join et non pas par un inner join. |
||
|
|
00
|
|
|
#4 | |||||||
|
Membre actif
![]() Inscription : février 2008 Messages : 455 ![]() |
Citation:
Je répète les deux requêtes : Code :
Code :
Les deux requêtes fonctionnent et donnent le bon résultat. Je m'étonne juste de la différence de performence. |
|||||||
|
|
00
|
|
|
#5 |
|
Membre du Club
![]() |
Bonjour,
Peut être j'ai pas compris la question ... mais je ne vois aucun problème. La différence est bien évidente car l'optimizer utilise l'index dans la première req et utilise un full scan dans la seconde, d'ou la diff de performance. Merci, Wissem www.oracle-class.com (Vidéos, Articles, Livres, Forum, Webinar ...tous sur Oracle) www.oracle-tns.com OCA & OCP Oracle |
|
01
|
|
|
#6 |
|
Membre Expert
![]() Inscription : août 2008 Messages : 1 271 ![]() |
Tout dépend de la volumétrie des 2 tables, si INFO a beaucoup plus de ligne que client alors il paraît normal que la requête scalaire soit plus performante. Quels sont les temps d'exécution des 2 requêtes ?
[EDIT] En fait j'ai toutes les infos dans le plan, étrange INFO semble quasiment 2x plus petite que CLIENT, les stats sont elles à jour ? |
|
|
00
|
|
|
#7 |
|
Expert Confirmé Sénior
![]() ![]() Marius NituIngénieur développement logiciels Inscription : octobre 2007 Messages : 3 311 ![]() |
|
|
|
00
|
|
|
#8 |
|
Membre actif
![]() Inscription : février 2008 Messages : 455 ![]() |
@orawiss : Donc lorsqu'il s'agit d'outer join, il est préférable d'utiliser la première méthode ? je suppos que dans le cas d'un inner join, c'est quand même préférable la deuxième méthode. Plutôt que d'avoir un select from (x table) where, on se retrouve alors avec des select (x select imbriqués) from where.. ça me paraît brouillon.
@skuatamad : C'est une table relation 1-1 avec une info liée à un client, cette info peut être inexistante. @mnitu : Oracle 10g |
|
|
00
|
|
|
#9 |
|
Expert Confirmé Sénior
![]() ![]() Marius NituIngénieur développement logiciels Inscription : octobre 2007 Messages : 3 311 ![]() |
Oracle 10g est plutôt bien au niveau d’optimiseur. Avez-vous vérifié les statistiques ?
Dpv optimisation, la façon d’écrire la requête n’est pas toujours neutre, surtout quand on sort du relationnel (via la sous-requête scalaire). Quand vous utilisez des sous-requêtes scalaires vous envoyé un signale fort à l’optimiseur en ce qui concerne le plan d’exécution. L’optimiseur a le choix de transformer votre sous-requête en utilisant un outer join mais comme ce type de transformation n’est pas toujours possible il est très probable qu’il va « suivre » vos indications. Mais, avec les statistiques à jour je pense qu’il pourrait opter pour un nested loop à la place de hash join. Exécutez le deuxième requête avec le hint gather_plan_statistics pour afficher les différences entre les cardinalités réelles et celles estimées. |
|
|
00
|
|
|
#10 |
![]() ![]() |
Vous n'avez pas aussi fait une erreur en recopiant la première requête ?
Car il ne fait qu'un et un seul unique appel à l'index, comme si on lui avait passé une valeur. Comme dit précédemment, les deux requêtes sont équivalentes dans une relation (0, 1).
__________________
Email : http://scr.im/waldar |
|
00
|
|
|
#11 | |||
|
Expert Confirmé Sénior
![]() ![]() Marius NituIngénieur développement logiciels Inscription : octobre 2007 Messages : 3 311 ![]() |
Citation:
Code :
|
|||
|
|
00
|
|
|
#12 |
|
Membre actif
![]() Inscription : février 2008 Messages : 455 ![]() |
Merci pour ces infos
|
|
|
00
|
Copyright © 2000-2012 - www.developpez.com