Optimizador Oracle, activar y desactivar características (Oracle DB)

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.

Right Decision, Wrong Decision Road SignCuando 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):

 

Source   
ALTER session SET optimizer_features_enabled='10.2.0.4';

o para hacerlo permanente:

Source   
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:

Source   
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:

Source   
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:

  1. Ir subiendo progresivamente el parámetro optimizer_features_enabled progresivamente hasta encontrarnos con el problema.
  2. 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):

Source   
ALTER session SET "_fix_control"='BUGNO:OFF';

o

Source   
ALTER system SET "_fix_control"='BUGNO:OFF';

El paso siguiente es buscar en metalink información relacionada y si es necesario crear un SR.

Deja un comentario