|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||||||||
![]() Arnaud TAMAILLON Inscription : juin 2002 Messages : 674 ![]() |
Bonjour,
Je travaille sur Oracle 10.2.0.4. Je rencontre aujourd'hui un souci qui me laisse perplexe, et je me tourne vers vous en quête d'une explication : une certaine requête non paramétrisée est extrèmement plus rapide que la même requête paramétrisée à laquelle on aurait passé les mêmes valeurs en paramètres. (1 seconde vs 1 minute) Ci dessous les requêtes et leur plan d'exécution. Code Requête paramétrisée :
Code Plan d'exécution :
Code Requête non paramétrisée :
Code Plan d'exécution :
S'agissant finalement du même plan, comment les coûts peuvent-il être aussi différents (moindre optimisation dans le cas de la requête paramétrisée du fait d'une moindre information ?) ? Et surtout, pourquoi une telle différence de temps d'exécution au final ? Avez-vous des pistes pour résoudre ce souci ? Merci d'avance, Arnaud |
||||||||
|
|
00
|
|
|
#2 |
|
Membre Expert
![]() ![]() Franck PachotDBA Oracle Inscription : novembre 2007 Messages : 703 ![]() |
Bonjour,
Sur le coût estimé, c'est normal puisque avec variable il estime que le prédicat correspond à 8000 entrées d'index alors qu'en conaissant la valeur (probablement la date qui est récente) c'est beaucoup moins. Par contre le coût réel devrait être le même. Peux-tu lancer la requête avec autotrace ou tkprof pour voir le nombre de blocs lus ? Le temps peut dépendre de ce qui est en cache. 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
|
|
|
#3 |
![]() Arnaud TAMAILLON Inscription : juin 2002 Messages : 674 ![]() |
Bonjour et merci de ta réponse.
Notre DBA a fini par trouver le souci. Nous appelions ces requêtes depuis du code .NET, et nous bindions un objet de type .NET DateTime dans un paramètre de type DbType.DateTime. Or DbType.DateTime correspond au type Oracle TimeStamp. Il fallait utiliser DbType.Date qui correspond au type Oracle Date. Cette simple erreur causait le problème de performance indiqué. Merci ! Arnaud |
|
|
00
|
|
|
#4 |
|
Expert Confirmé Sénior
![]() ![]() Marius NituIngénieur développement logiciels Inscription : octobre 2007 Messages : 3 311 ![]() |
Franchement je ne crois pas trop à votre solution. Déjà parce qu’un DBA qui fait tourner une base Oracle 10g en mode CHOOSE ce n’est pas un bon signe.
Je pense plutôt que vous avez être victime d’un phénomène de type introspection des valeurs des variables de liaison, « peek variable binding ». Une investigation plus approfondie pourrait vous éviter des mauvaises surprises dans l’avenir. |
|
|
00
|
|
|
#5 |
![]() Arnaud TAMAILLON Inscription : juin 2002 Messages : 674 ![]() |
Les paramètres passés avec ces paramètres ont permis de corriger la performance, suite à analyse par un de nos dba.
Je ne vois pas de raison de douter de son diagnostic en l'état. En revanche, merci d'avoir porté ce phénomène de "peek variable binding", je vais étudier le cas et voir si il nous faut creuser plus loin. Quand au fait que la base tourne en mode CHOOSE, je leur fait confiance sur la pertinence de ce choix, et d'ailleurs, je ne suis pas qualifié pour le critiquer. S'agissant d'une base critique énorme centralisant des traitements énormes et vieille de plus de 10 ans, avec des critères de disponibilité extrèmes, j'imagine que les changements de versions d'Oracle n'ont pas justifié la prise de risque amenée par un changement de configuration (mais là encore n'étant pas spécialiste, et mon problème de performance étant résolu). |
|
|
00
|
|
|
#6 |
|
Expert Confirmé Sénior
![]() ![]() Marius NituIngénieur développement logiciels Inscription : octobre 2007 Messages : 3 311 ![]() |
Bonjour,
Je vais essayer en quelques mots de vous donner « ma raison ». Votre requête paramétrée existe déjà dans le shared pool. Le plan d’exécution qu’elle utilise a été déterminé par la valeur passé dans la variable de liaison (binding variable ou paramètre) au moment du "hard parsing" de la requête. A ce moment un curseur parent et un curseur fils à été crée et stockés dans le shared pool. Quand vous avez changé le type de la variable de liaison en utilisant le DbType.Date le curseur parent est resté identique mais le nouveau type de la variable de liaison fait que le curseur fils ne peut plus être utilisé et donc un nouveau plan a été recherché en utilisant cette fois la nouvelle valeur de la variable de liaison. Ce qui à « résolu » en apparence votre problème de performance. Jusqu’au là, dans votre cas, ces ne sont que des hypothèses. Mais, pour avancer je pense que vous pouvez faire un test assez simple. L’idée est de ré-exécuter 2 à 3 fois votre requête avec un variable de liaison de type DateTime (celle qui vous posée des soucis) et la valeur de votre exemple mais, en prenant soin de s ‘assurer que le hard parsing a lieu. Pour cella divers méthodes peuvent être employées comme par exemple la modification de la requête par l’ajout d’un alias de la table. Si votre DBA a raison le temps d’exécution de la requête doit reste désastreux : c’est le type de la variable qui pose problème, non ? Si non ou pourrait en discuter. Bon courage! |
|
|
20
|
|
|
#7 | |||||||||
|
Expert Confirmé Sénior
![]() ![]() Marius NituIngénieur développement logiciels Inscription : octobre 2007 Messages : 3 311 ![]() |
Churchil disait
Citation:
D'abord il y a eu création d'un index simple sur la colonne hire_date. Ensuite deux blocs PL/SQL sont exécutés avec des variables de liaison de type différentes: date et timestamp mais, initialisés avec la même valeur. Code :
Code :
Code :
Code :
Dans le cas où la variable de liaison est de type timestamp l'index est utilisé en full scan, c'est-à-dire en mode balayage complet à cause de la fonction de conversion INTERNAL_FUNCTION. Merci à Oracle de ne pas bien documenter ces choses. Et maintenant il n'y plus de mystère et toute le monde comprends pourquoi il y a des problèmes de performance dans ce cas. A plus, Marius NITU |
|||||||||
|
|
10
|
|
|
#8 |
|
Membre confirmé
![]() Ahmed AANGOURDBA Etudes Oracle Inscription : janvier 2010 Messages : 123 ![]() |
Je confirme l'analyse de Mnitu. Vous êtes là face à un pb lié au Bind variable Peeking.
Le fait d'avoir changé le type de la variable a juste forcé un hard parse et donc un plan (approprié pour la date exécutée) a été trouvé. En ajoutant un simple espace dans la requête vous seriez arrivé au même résultat. Est-ce que pour autant vous en auriez conclu que l'espace permet de régler le pb de perf sur cette requête? En tapant Bind Peeking sur Google vous trouverez un grand nombre d'articles sur le sujet (surtout en anglais). j'ai essayé d'en écrire un en français il y'a quelques mois ici: http://ahmedaangour.blogspot.com/201...e-peeking.html J'espère que ça vous permettra d'y voir plus claire.
__________________
Mon blog Oracle: http://ahmedaangour.blogspot.com/ |
|
00
|
|
|
#9 |
![]() Arnaud TAMAILLON Inscription : juin 2002 Messages : 674 ![]() |
Merci de vos précisions, j'ai d'ores et déjà remonté ce point du côté de notre équipe de dev et de dbas pour surveillance.
Nous suivons la chose, et aurons ce point à l'esprit en cas de souci. Merci beaucoup pour votre aide! |
|
|
00
|
|
|
#10 | |
|
Expert Confirmé Sénior
![]() ![]() Marius NituIngénieur développement logiciels Inscription : octobre 2007 Messages : 3 311 ![]() |
Citation:
Ce n’est pas un problème de peek variable binding comme j'avais pensé au départ mais bien, un des cases ou le type de la variable de liaison (binding variable) influence le plan d’exécution. |
|
|
|
00
|
|
|
#11 |
|
Membre confirmé
![]() Ahmed AANGOURDBA Etudes Oracle Inscription : janvier 2010 Messages : 123 ![]() |
![]() ça m'apprendra à lire les posts en diagonale.
__________________
Mon blog Oracle: http://ahmedaangour.blogspot.com/ |
|
00
|
|
|
#12 |
|
Membre confirmé
![]() Ahmed AANGOURDBA Etudes Oracle Inscription : janvier 2010 Messages : 123 ![]() |
Le dernier article apparu sur le blog des développeurs du CBO Oracle m'a fait penser à cette discussion.
C'est exactement le même problème rencontré: http://blogs.oracle.com/optimizer/en...t_from_sqlplus
__________________
Mon blog Oracle: http://ahmedaangour.blogspot.com/ |
|
00
|
Copyright © 2000-2012 - www.developpez.com