|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||
|
Invité de passage
![]() Inscription : février 2007 Messages : 13 ![]() |
Bonsoir à tous,
Je suis confronté à un problème d'optimisation de requête SQL, celle-ci prenant beaucoup trop de temps à l’exécution. Voici la requête : Code :
Lorsque je demande à ORacle de me fournir le plan d'execution de la requete (Explain Plan), celui-ci ne retourne deux TABLE ACCESS FULL. Je souhaiterais qu'il utilise mes index car je pense que le traitements de la requête irait largement plus vite...? Je ne suis pas doué en tuning / optimisation de requête, donc merci d'avance pour votre indulgence. J'ai pourtant lu par mal de cours mais j'ai surement dû passer à coté de quelques chose, et je ne comprends pas pourquoi. Est-ce à cause de la concaténation ? Pourtant lorsque je ne prend qu'un seul champ, lui aussi indexé (j'ai testé la création d'index simples et supprimé ceux sur trois colonnes pour le tests) et le résultat est le même, Oracle n'utilise pas l'index. A savoir que j'ai également lancé la commande "analyze table CSSOR compute statistics;" Afin qu'Oracle puisse revoir le plan d’exécution. Merci d'avance pour vos réponses. Cordialement, Paul |
||
|
|
00
|
|
|
#2 | ||
![]() ![]() Alain Ingénieur d'études décisionnel Inscription : mai 2002 Messages : 4 445 ![]() |
Et as-tu essayé avec EXISTS ?
Code :
__________________
Modérateur Langage 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 ![]() |
||
|
|
10
|
|
|
#3 | ||
|
Membre Expert
![]() ![]() Franck PachotDBA Oracle Inscription : novembre 2007 Messages : 703 ![]() |
Bonjour,
1. La concaténation n'est pas une bonne idée. En plus elle peut renvoyer un résultat faux. Pourquoi nhe pas écrire: Code :
3. un accés par index n'est pas toujours le plus optimal Cordialement, Franck. Cordialement, Franck.
__________________
A lire sur mon blog Oracle - Articles d'Experts des articles traduits en français de Jonathan Lewis, Tom Kyte, Doug Burns, Cary Millsap, Greg Rahn ...
|
||
|
00
|
|
|
#4 |
|
Invité de passage
![]() Inscription : février 2007 Messages : 13 ![]() |
Merci Alain,
Effectivement, avec EXISTS, la requête utilise l'index. Le temps de traitement passe donc de plus de 20 minutes à peine 4 minutes. Je pense que la clause NOT IN devait empêcher l'utilisation de l'index ? Merci Cordialement, Paul |
|
|
00
|
|
|
#5 | |||||||||||
|
Membre expérimenté
![]() Mohamed HouriInscription : mars 2010 Messages : 286 ![]() |
Citation:
Code :
Code :
Code :
Code :
Et voilà enfin, le CBO a fini par utiliser mon index. Conclusion Dans votre cas il y a plusieurs points à considérer (a) Concaténation de colonnes indexées. Comment réagit le CBO dans ce cas ? je ne l’ai pas essayé encore (b) Dans le cas où vous n’avez utilisé qu’une seule colonne, c’est bien le NOT IN qui empêche l’utilisation de l’index sur cette colonne. Il faudra penser plutôt à la création d’un function based index dans cette situation (c) La liste de votre NOT IN est constituée d’un select sur une autre table. A votre place j’utiliserai plutôt un not exists comme suit: Code :
|
|||||||||||
|
|
10
|
|
|
#6 | ||
|
Expert Confirmé Sénior
![]() ![]() Marius NituIngénieur développement logiciels Inscription : octobre 2007 Messages : 3 311 ![]() |
Faites attention :
|
||
|
|
00
|
|
|
#7 | ||||||
|
Membre expérimenté
![]() Mohamed HouriInscription : mars 2010 Messages : 286 ![]() |
Citation:
Tiré de mon blog Citation:
|
||||||
|
|
00
|
|
|
#8 |
|
Invité de passage
![]() Inscription : février 2007 Messages : 13 ![]() |
Merci à tous, super les explications, j'ai parfaitement compris
Un grand merci à vous tous pour l'exactitude et la rapidité de vos réponses. |
|
|
00
|
|
|
#9 | ||||||
|
Membre expérimenté
![]() Mohamed HouriInscription : mars 2010 Messages : 286 ![]() |
Marius,
Pour en revenir au cas que vous avez posté Code :
Si par exemple j'ajoute une seule colonne à la requête, l'index n'est plus, ni accédé, ni utilisé Code :
Code :
|
||||||
|
|
00
|
|
|
#10 | |
|
Expert Confirmé Sénior
![]() ![]() Marius NituIngénieur développement logiciels Inscription : octobre 2007 Messages : 3 311 ![]() |
Mohamed,
C’était juste pour nuancer vos propos Citation:
D’autre part je trouve un peu forcé l’idée de créer un index fonctionnel dans ce cas. |
|
|
|
00
|
|
|
#11 | |
|
Membre expérimenté
![]() Mohamed HouriInscription : mars 2010 Messages : 286 ![]() |
Citation:
|
|
|
|
00
|
|
|
#12 | |
|
Membre Expert
![]() ![]() Franck PachotDBA Oracle Inscription : novembre 2007 Messages : 703 ![]() |
Bonjour,
Citation:
Le problème n'est pas d'écrire d'une façon ou d'une autre. L'optimiseur va de toute façon le réécrire à sa sauce. Mais d'être précis sur les données et le résultat qu'on veut. Cordialement, Franck.
__________________
A lire sur mon blog Oracle - Articles d'Experts des articles traduits en français de Jonathan Lewis, Tom Kyte, Doug Burns, Cary Millsap, Greg Rahn ...
|
|
|
00
|
|
|
#13 |
|
Membre expérimenté
![]() Mohamed HouriInscription : mars 2010 Messages : 286 ![]() |
Pour plus d'information à ce sujet
http://richardfoote.wordpress.com/20...-not-now-john/ http://jonathanlewis.wordpress.com/2007/02/25/not-in/ |
|
|
00
|
|
|
#14 | ||
|
Expert Confirmé Sénior
![]() ![]() Marius NituIngénieur développement logiciels Inscription : octobre 2007 Messages : 3 311 ![]() |
Citation:
Citation:
|
||
|
|
00
|
|
|
#15 | |
|
Expert Confirmé Sénior
![]() ![]() Marius NituIngénieur développement logiciels Inscription : octobre 2007 Messages : 3 311 ![]() |
Citation:
|
|
|
|
00
|
Copyright © 2000-2012 - www.developpez.com