Con cada versión o release de Oracle Database, se añaden nuevas funcionalidades y correcciones de bugs en el optimizador, esto en principio es bueno pero cualquier modificación de código puede incluir nuevos bugs.
Cuando actualizamos de una versión de Oracle a otra superior es posible que algunas consultas funcionen realmente mal, esto se puede solucionar con un workaround del tipo (si hemos migrado a 11gr2 desde 10.2.0.4 por ejemplo):
ALTER session SET optimizer_features_enabled='10.2.0.4';
o para hacerlo permanente:
ALTER system SET optimizer_features_enabled='10.2.0.4' scope=BOTH;
Esta instrucción lo que hace es desactivar bloques de características. Podemos ver el número de características activas con:
SELECT optimizer_feature_enable,count(*)
FROM v$system_fix_control
GROUP BY optimizer_feature_enable ORDER BY 1 ASC;
OPTIMIZER_FEATURE_ENABLE |
COUNT(*) |
10.1.0 |
3 |
10.1.0.3 |
1 |
10.1.0.5 |
2 |
10.2.0.1 |
7 |
10.2.0.2 |
12 |
10.2.0.3 |
11 |
10.2.0.4 |
73 |
10.2.0.5 |
112 |
11.1.0.6 |
40 |
11.1.0.7 |
19 |
11.2.0.1 |
67 |
11.2.0.2 |
106 |
11.2.0.3 |
75 |
8.0.0 |
63 |
8.1.6 |
1 |
8.1.7 |
2 |
9.2.0 |
8 |
9.2.0.8 |
3 |
47 |
Podemos ver más detalle de cada uno de las características, con por ejemplo:
SELECT *
FROM v$system_fix_control
WHERE optimizer_feature_enable='11.2.0.3';
BUGNO |
VALUE |
SQL_FEATURE |
DESCRIPTION |
OPTIMIZER_FEATURE_ENABLE |
EVENT |
IS_DEFAULT |
9702850 |
1 |
QKSFM_ACCESS_PATH_9702850 |
adjust for NULLs only once for NOT inlists |
11.2.0.3 |
0 |
1 |
9958518 |
1 |
QKSFM_CBO_9958518 |
relax type matching for dates in transitive predicate generation |
11.2.0.3 |
0 |
1 |
8349119 |
1 |
QKSFM_FBA_8349119 |
parallel versions query for archiving for flashback archive |
11.2.0.3 |
0 |
1 |
Si estamos totalmente seguros que de nuestras sentencias deberían ejecutarse correctamente y no dispararse los tiempos (algo que abría que analizar), podemos suponer que se trata de un bug incluido en alguna de las mejoras del optimizador.
Para detectar el bug lo más sencillo es:
- Ir subiendo progresivamente el parámetro optimizer_features_enabled progresivamente hasta encontrarnos con el problema.
- Examinar que mejoras se han incluido en el optimizador examinando la tabla v$system_fix_control junto con la consulta localizada que se ve afectada e ir comprobando uno a uno (con ayuda del campo descripción), si se ajusta a nuestra casuística.
Una vez detectado el bug debemos desactivar esta mejora con (donde BUGNO se puede obtener de la consulta anterior):
ALTER session SET "_fix_control"='BUGNO:OFF';
o
ALTER system SET "_fix_control"='BUGNO:OFF';
El paso siguiente es buscar en metalink información relacionada y si es necesario crear un SR.