-
mode choose inefficace
Bonjour,
J'ai une requête du type
Code:
select * from table1 a, table2 b where a.cle=b.cle and b.champ2='CLE-CHAMP2'
J'ai comme caractéristiques :
- table 1 et table 2 possèdent un index sur cle.
- table 1 a des stats a jour.
- table 2 n'a pas de stats ni d'histogrammes car c'est une table très volatile.
- table1 est une table volumineuse
- b.champ2='CLE_CHAMP2' peut renvoyer un faible volume ou un important volume de données
Comme il n'y a pas d'histogrammes sur table2, oracle est incapable de mesurer la sélectivité de b.champ2='CLE_CHAMP2'. De ce fait il fait un full scan systématiquement sur table 1 mais si la sélectivité est très grande.
Si je calcule les histogrammes, ceux-ci sont très rapidement obsolètes car la table est très volatile. Je voudrais éviter d'avoir à calculer les histogrammes systématiquement avant d'exécuter la requête. Oracle 10g fait de l'échantillonnage dynamique mais je suis en oracle 9. Est ce quelqu'un a une idee pour que l'index de la table 1 soit utilisé quand la sélectivité est grande ?
-
Salut !
A partir d'Oracle 9.2, tu as le dynamic sampling : le CBO peut chercher des échantillons à la volée pour estimer la sélectivité.
Deux possibilités :
- Paramètre OPTIMIZER_DYNAMIC_SAMPLING
- Hint /*+ DYNAMIC_SAMPLING([@queryblock] [<tablespec>] <integer>) */
[EDIT]
Un petit article de l'oncle Tom pour expliquer les détails :
http://www.oracle.com/technology/ora...o19asktom.html
-
level10
Ok, merci beaucoup, je croyais que le paramètre n'était dispo qu'à partir de la 10g.
J'ai mis le level à 8 car en-dessous le résultat n'est pas satisfaisant ( 2 ca ne marche pas car la colonne est indexé, 3 et 4 ne donnent pas des résultats satisfaisants mais je ne comprends pas à quoi correspondent ces niveaux ?!)
enfin merci encore