2009-05-13 121 views
32

En Oracle 10gr2, tengo varias consultas SQL que estoy comparando el rendimiento, pero después de la primera ejecución, la tabla v $ sql tiene el plan de ejecución almacenado para el almacenamiento en caché, por lo que para una de las consultas voy de 28 segundos en la primera ejecución .5 segundos después.¿cómo borro el caché del plan de ejecución Oracle para el benchmarking?

He intentado

ALTER SISTEMA DE DESCARGA BUFFER_CACHE; - Después de ejecutar esto, la consulta se ejecuta de manera consistente en 5 segundos, lo cual no creo que sea preciso.

pensamiento tal vez eliminar el elemento propia línea de la caché: eliminar de v $ sql donde sql_text como 'select * from .... pero conseguir un error acerca de no ser capaz de eliminar de la vista.

+1

v $ sql no es realmente una tabla, es una vista de rendimiento dinámico, y no, no puede eliminar filas de ella. – spencer7593

Respuesta

16

Ha pasado un tiempo desde que trabajé con Oracle, pero creo que los planes de ejecución se almacenan en caché en el grupo compartido. Prueba esto:

alter system flush shared_pool; 

El caché del búfer es donde Oracle almacena los datos recientemente usados ​​ con el fin de reducir al mínimo io disco.

+0

mi consulta de 28 segundos tarda 1,5 segundos después de ejecutar ese comando –

+1

Lo siento, esto no funcionó para ti. Sin embargo, así es como borras el plan de ejecución en caché. :) – Peter

49

Peter le dio la respuesta a la pregunta que hizo.

alter system flush shared_pool; 

Esa es la afirmación que usaría para "eliminar declaraciones preparadas de la memoria caché".

(declaraciones preparadas no son los únicos objetos añade desde la piscina compartida, la declaración hace más que eso.)

Como indiqué en mi comentario anterior (en su pregunta), v$sql no es una tabla. Es una vista de rendimiento dinámico, una conveniente representación en forma de tabla de las estructuras de memoria interna de Oracle. Solo tiene el privilegio SELECT en las vistas de rendimiento dinámico, no puede eliminar filas de ellas.


al ras de la piscina y el tampón de caché compartida?

Lo siguiente no responde su pregunta directamente. En su lugar, responde una pregunta fundamentalmente diferente (y tal vez más importante):

¿Deberíamos normalmente purgar el grupo compartido y/o la memoria caché del búfer para medir el rendimiento de una consulta?

En resumen, la respuesta es no.

Creo que Tom Kyte aborda esta bastante bien:

http://www.oracle.com/technology/oramag/oracle/03-jul/o43asktom.html
http://www.oracle.com/technetwork/issue-archive/o43asktom-094944.html

<extracto>

En realidad, es importante que una herramienta de ajuste no hace eso. Es importante ejecutar la prueba, ignorar los resultados y luego ejecutarla dos o tres veces y promediar esos resultados. En el mundo real, la memoria caché del búfer nunca carecerá de resultados. Nunca.Cuando sintonice, su objetivo es reducir la E/S lógica (LIO), porque entonces la E/S física (PIO) se encargará sola.

Considere esto: Vaciar el grupo compartido y la memoria caché del búfer es aún más artificial que no descargarlos. La mayoría de la gente parece escéptica de esto, sospecho, porque va en contra de la sabiduría convencional. Te mostraré cómo hacer esto, pero no para que puedas usarlo para probar. Más bien, lo usaré para demostrar por qué es un ejercicio inútil y totalmente artificial (y por lo tanto conduce a suposiciones erróneas). Acabo de iniciar mi PC, y he ejecutado esta consulta en una gran mesa. I "vaciar" la caché del búfer y ejecutar de nuevo:

</extracto >

Creo que Tom Kyte es exactamente correcto. En términos de abordar el problema del rendimiento, no creo que "borrar el caché del plan de ejecución del oráculo" sea normalmente un paso para una evaluación comparativa confiable.

Vamos a abordar la preocupación sobre el rendimiento.

Nos dice que ha observado que la primera ejecución de una consulta lleva mucho más tiempo (~ 28 segundos) en comparación con las ejecuciones posteriores (~ 5 segundos), incluso cuando se vacía (todos los bloques de índice y datos) la memoria caché del buffer

Para mí, eso sugiere que el parse duro está haciendo un trabajo pesado. Es mucho trabajo o tiene muchas esperas. Esto puede ser investigado y ajustado.

Me pregunto si tal vez las estadísticas no existen, y el optimizador está gastando mucho tiempo recopilando estadísticas antes de preparar un plan de consulta. Esa es una de las primeras cosas que verificaría, que las estadísticas se recopilan en todas las tablas, índices y columnas indexadas a las que se hace referencia.

Si su consulta se une a un gran número de tablas, la CBO puede estar considerando una gran cantidad de permutaciones para la orden de unión.

Una discusión del seguimiento de Oracle está fuera del alcance de esta respuesta, pero es el siguiente paso.

Estoy pensando que son probablemente va a querer rastrear eventos 10053 y 10046.

Aquí hay un enlace a un "evento 10053" discusión de Tom Kyte usted puede encontrar útil:

http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:63445044804318


tangencialmente relacionado historia anecdótica re: el rendimiento de análisis dura

Hace unos años, vi una consulta que había transcurrido en términos de minutos en la primera ejecución, ejecuciones posteriores en términos de segundos. Lo que descubrimos fue que la gran mayoría del tiempo para el primer tiempo de ejecución se gastó en el análisis detallado.

Este problema de consulta fue escrito por un desarrollador de CrystalReports que inocentemente (¿ingenuamente?) Unió dos enormes vistas de informes.

Una de las vistas era una combinación de 62 tablas, la otra vista era una combinación de 42 tablas.

La consulta utilizó el optimizador basado en costos.El seguimiento reveló que no era el tiempo de espera, sino todo el tiempo de CPU dedicado a evaluar posibles rutas de combinación.

Cada una de las vistas de "informes" suministradas por el proveedor no era tan mala en sí misma, pero cuando dos de ellas se unieron, era terriblemente lenta. Creo que el problema fue la gran cantidad de permutaciones de unión que el optimizador estaba considerando. Hay un parámetro de instancia que limita el número de permutaciones consideradas por el optimizador, pero nuestra solución fue volver a escribir la consulta. La consulta mejorada solo se unió a la docena de tablas que realmente necesitaba la consulta. (La solución inmediata de corto plazo fue programar una ejecución de la consulta antes de la mañana, antes de ejecutar la tarea de generación de informes. Eso hizo que la generación de informes "más rápido", porque uso de la declaración ya preparada en el grupo compartido, evitando el análisis detallado.

El parche no era una solución real, simplemente trasladaba el problema a una ejecución preliminar de la consulta, cuando el tiempo de ejecución largo no era 'notado.

Nuestro siguiente paso probablemente habría sido implementar un "esquema almacenado" para la consulta, para obtener un plan de consulta estable.

Por supuesto, la reutilización de sentencias (evitando el análisis detallado, utilizando variables de vinculación) es el patrón normativo en Oracle. Mejora el rendimiento, la escalabilidad, yada, yada, yada.

Este incidente anecdótico puede ser completamente diferente al problema que está observando.


HTH

+2

Enlace actualizado para el _ "En el mundo real, el caché del búfer nunca carecerá de resultados. Nunca." _ Cita es [http://www.oracle.com/technetwork/issue-archive/o43asktom-094944 .html] –

+0

@ mm1978: Gracias por actualizar el artículo de (reubicado) de Tom Kyte. – spencer7593

0

Hemos estado haciendo mucho trabajo últimamente con consultas de optimización del rendimiento, y uno de los culpables de rendimiento de las consultas inconsistente es el archivo de caché del sistema que Oracle está sentado.

Es posible que mientras esté limpiando la memoria caché de Oracle, el sistema de archivos aún tenga los datos que su consulta está solicitando, lo que significa que la consulta aún regresará rápidamente.

Desafortunadamente, no sé cómo borrar la caché del sistema de archivos; solo utilizo un script muy útil de nuestros muy útiles administradores de sistemas.

Cuestiones relacionadas