|
Publicité ' | |||||||||||||||||||||||
|
|
#1 |
|
Membre habitué
![]() Inscription : février 2006 Messages : 139 ![]() |
Bonjour,
je vous présente les données de ma question: une table toute bête avec par exemple 2 colonnes: col1 et col2 la table comporte x rows et pour 1% des lignes col1 = Y et 99% des lignes col1 = N on met un index classique, donc dans notre cas de mauvaise sélectivité, sur col1. Et on requête avec une clause where sur col1 avec une variable liée(col1=:var) Vous m'arrêtez si je dis des bêtises mais dans ces conditions l'optimizer va sûrement préférer un full plutôt que prendre l'index (pour :var =Y ou N). Donc lorsque :var=Y on peut difficilement avoir un plan plus merdique. Maintenant On rajoute un histogramme sur col1, tout à fait indiqué dans mon cas. En admettant que la requete soit en memoire et que son plan actuel soit un full scan, si je fais ma query col1=:var avec :var=Y QUE VA T'IL SE PASSER? Le sql va t'il etre reparsé? le plan va t'il changé? si le sql n'est jamais dechargé de la memoire, le plan du full sera toujours choisit? Merci pour votre aide |
|
|
00
|
|
|
#2 |
![]() ![]() Inscription : janvier 2004 Messages : 15 861 ![]() |
oui, ça va changer parce que les stats sont recalculées
|
|
|
00
|
|
|
#3 |
|
Membre habitué
![]() Inscription : février 2006 Messages : 139 ![]() |
Bonjour,
ok donc maintenant je suis avec un plan d'exécution avec un index. Si rien ne change par ailleurs(requête toujours en shared pool, pas de recalcul de stat,..), Est ce que je peux me retrouver avec un full scan suivant la valeur de la bind variable? Merci |
|
|
00
|
|
|
#4 |
![]() ![]() Inscription : janvier 2004 Messages : 15 861 ![]() |
oui puisque tu as calculer les histogrammes. Si tu as un index déséquilibré il n'est pas impossible de faire un FULL SCAN. Mais attention, un FTS n'est pas forcément mauvais. Si une valeur retourne 90% (chiffre pris arbitrairement
|
|
|
00
|
|
|
#5 | ||
|
Membre confirmé
![]() Inscription : octobre 2006 Messages : 221 ![]() |
J'ai testé ça (10.1.0.4):
Code :
DAB |
||
|
|
00
|
|
|
#6 |
|
Membre habitué
![]() Inscription : février 2006 Messages : 139 ![]() |
Merci dab.cz,
c'est un peu là où je voulais en arriver. A part de réécrire le sql sans bind variable, y a un gros problème. De plus je n'ai rien trouvé pour forcer une requête à être reparsée ou déchargée de la mémoire. Vous faites comment vous? Merci |
|
|
00
|
|
|
#7 | ||
|
Membre confirmé
![]() Inscription : octobre 2006 Messages : 221 ![]() |
Une manière brutale:
Dans les cases spécial, je n'utiliserais pas de variable liée: Code :
|
||
|
|
00
|
|
|
#8 |
![]() ![]() Inscription : janvier 2004 Messages : 15 861 ![]() |
DAB.cz
kervoaz |
|
|
00
|
|
|
#9 | |
![]() ![]() Inscription : janvier 2004 Messages : 15 861 ![]() |
Citation:
|
|
|
|
00
|
|
|
#10 |
|
Membre habitué
![]() Inscription : février 2006 Messages : 139 ![]() |
Merci pour vos réponses.
j'avais exclus l'alter volontairement Mon problème est que l'on va avoir 1 chance sur 2 d'avoir un très mauvais plan. Pour l'utilisateur le problème devient "aléatoire". et Pour moi le problème est difficile à deceler et à corriger. Cdt |
|
|
00
|
|
|
#11 |
![]() ![]() Inscription : janvier 2004 Messages : 15 861 ![]() |
il suffit de tracer les sessions et comprendre pourquoi le plan change, encore une fois, je mets une petite piéce sur les histogrammes et la répartition des données dans la table
|
|
|
00
|
|
|
#12 |
|
Membre habitué
![]() Inscription : février 2006 Messages : 139 ![]() |
orafrance
dans mes hypothèses de départ il y a effectivement un histogramme sur la colonne(ce qui n'est pas reflété dans le code DAB.cz) Cependant même avec les histogrammes, si le SQL n'est pas reparsé pourquoi le plan changerait-il? (qui est ma principale question). |
|
|
00
|
|
|
#13 |
![]() ![]() Inscription : janvier 2004 Messages : 15 861 ![]() |
parce que le but de l'histogramme c'est justement de fournir au CBO les infos sur la répartition des données... pour moi, avec histogramme c'est quasiment toujours reparsé d'ailleurs si tes utilisateurs ont des résultats plus ou moins bon c'est bien que l'explain plan change non ?
|
|
|
00
|
|
|
#14 |
|
Membre habitué
![]() Inscription : février 2006 Messages : 139 ![]() |
Merci pour votre aide.
Il faut que je refasses une verif pour ne pas vous dire de bêtises. Je vous dit ça rapidement Merci |
|
|
00
|
|
|
#15 |
|
Membre confirmé
![]() Inscription : octobre 2006 Messages : 221 ![]() |
|
|
|
00
|
|
|
#16 |
|
Membre habitué
![]() Inscription : février 2006 Messages : 139 ![]() |
ben voilà.
Les explications d'un pro sont bien plus claires que les miennes. C'est exactement le problème que je rencontre en 9 et 10 avec une solution en 11. Un grand merci |
|
|
00
|
|
|
#17 |
|
Membre chevronné
![]() DBA Oracle freelance Inscription : janvier 2005 Messages : 558 ![]() |
Il me semble que le paramètre _optim_peek_user_binds mis à false évite ce genre de situation (mauvais plan d'exec avec bind variable).
Il est à positionner en environnement SAP. |
|
|
00
|
|
|
#18 |
|
Expert Confirmé
![]() Inscription : septembre 2004 Messages : 2 942 ![]() |
STOP : il s'agit d'un paramèter non documenté qui ne doit être activé que sur demande express du support (Oracle ou SAP par exemple).
|
|
|
00
|
Copyright © 2000-2012 - www.developpez.com