sql >> Base de Datos >  >> RDS >> Oracle

Muestreo dinámico Matándome en 12c

Hace once días, escribí en un blog sobre cómo Adaptive Dynamic Stats estaba consumiendo recursos en mis bases de datos RAC de producción.

Después de apagar ese incendio, me dispuse a examinar algunas consultas de bajo rendimiento informadas por nuestro personal de control de calidad en Test y otras bases de datos que no son de producción. Hice lo que cualquier buen Oracle DBA haría. Reuní una llamada de procedimiento almacenado que duplicaba el problema. En mi sesión, inicié un seguimiento de SQL y ejecuté el procedimiento almacenado. Tardó 50 segundos en completarse, cuando solía tardar 5 segundos o menos antes de actualizar de 11.2.0.4 a 12.1.0.2. Este procedimiento almacenado contiene una serie de instrucciones SQL y un seguimiento de SQL parecía un lugar lógico para comenzar. Necesitaba saber qué instrucción SQL en el procedimiento estaba causando los problemas.

Ejecuté el archivo de seguimiento de SQL a través de TKPROF y me sorprendieron los resultados. Las declaraciones SQL en el procedimiento almacenado parecían ejecutarse con bastante rapidez. Pero fui recibido por muchas declaraciones similares a las siguientes:

SELECT /* DS_SVC */ /*+ dynamic_sampling(0) no_sql_tune no_monitoring
 optimizer_features_enable(default) no_parallel */ SUM(C1)
FROM
 (SELECT /*+ qb_name("innerQuery") INDEX_FFS( "XXX"
 "INDEX_NAME") */ 1 AS C1 FROM
 "OWNER"."TABLE_NAME" SAMPLE BLOCK(71.048, 8) SEED(1)
 "XXX") innerQuery

Esto es muestreo dinámico en el trabajo. Al observar todas las declaraciones de muestreo dinámico que se ejecutan en mi archivo de seguimiento, ¡pude determinar que representaban 45 segundos del tiempo de ejecución general! ¡Ay!

Se supone que el muestreo dinámico me ayudará. Se supone que el tiempo dedicado a obtener algunas estadísticas de muestra es mucho menor que la cantidad de tiempo ahorrado al ejecutar la instrucción SQL con mejores estadísticas. Si no es así, el rendimiento de su declaración SQL puede verse afectado, como fue mi caso.

Noté una cosa que me pareció interesante fue que estas consultas de muestreo dinámico se ejecutaron una vez para cada tabla y una vez para cada uno de sus índices. Una de las tablas involucradas en mi consulta tiene 7 índices, por lo que para esa tabla, ¡tenía 8 consultas de muestreo dinámico!

En mi publicación de blog hace 11 días, configuré el parámetro Optimizer_dynamic_sampling en 0, lo que impide que se ejecuten estas consultas. Todavía no había puesto ese cambio en nuestro entorno de prueba, así que necesitaba hacerlo. Tan pronto como lo hice, el rendimiento de las consultas volvió a la normalidad. El valor predeterminado de este parámetro para mi base de datos es 2. Su valor predeterminado puede variar según el valor de la configuración Optimizer_features_enable. Según esta publicación de blog, un valor de 2 significa que el muestreo dinámico se activará cuando al menos una de las tablas no tenga estadísticas. Pero para ser honesto, el muestreo dinámico no me brinda ningún beneficio y solo me causa daño. Así que lo dejaré en su totalidad por ahora.