Normalement on sait comment se comporte l’optimiseur Oracle, mais quand on a des surprises, c’est parfois tout simplement lié au paramétrage CBO, donc avant de sauter aux conclusions un petit check-up n’est pas du luxe.
Deux requêtes pour ça, les premières, basées sur v$sys_optimizer_env, pour vérifier le paramétrage, la dernière, basée sur v$system_fix_control pour voir si on a modifié le patchset :
select NAME , VALUE , DEFAULT_VALUE from v$sys_optimizer_env where VALUE <> DEFAULT_VALUE ;
Résultat (pour exemple de pourquoi ce con m’a mis optimizer_index_caching à 100 ? )
NAME VALUE DEFAULT_VALUE ---------------------------------------- ------------------------- ------------------------- _pga_max_size 4194200 KB 2048000 KB optimizer_index_cost_adj 10 100 optimizer_index_caching 100 0
Si on a la possibilité d’effectuer la requête en tant que SYS, on peut aller un peu plus loin avec la ‘fixed table’ x$qkscesys :
select pname_qkscesyrow NAME , PVALUE_QKSCESYROW VALUE , DEFPVALUE_QKSCESYROW default_value from x$qkscesys where PVALUE_QKSCESYROW != DEFPVALUE_QKSCESYROW union select name , value , default_value from v$sys_optimizer_env where VALUE <> DEFAULT_VALUE ;
Il est à noter que l’on peut aussi travailler au niveau des sessions avec x$qksceses et v$ses_optimizer_env, attention cependant, ces vues renseignent les SID (Session ID) mais pas les valeurs par défaut.
select VALUE , DESCRIPTION , OPTIMIZER_FEATURE_ENABLE from V$SYSTEM_FIX_CONTROL where IS_DEFAULT=0 ;
C’était pourtant pas si compliqué.