2012-06-11 10 views
6

Tengo una declaración que se ejecuta en el servidor de la base de datos Oracle. La declaración tiene aproximadamente 5 uniones y no hay nada inusual allí. Se ve muy parecido a continuación:Uso de la sugerencia de Oracle "FIRST_ROWS" para mejorar las prestaciones de la base de datos Oracle

SELECT field1, field2, field3, ... 
FROM table1, table2, table3, table4, table5 
WHERE table1.id = table2.id AND table2.id = table3.id AND ... 
     table5.userid = 1 

El problema (y lo que es interesante) es que la declaración de ID de usuario = 1 toma 1 segundo para devolver 590 registros. La declaración para ID de usuario = 2 toma alrededor de 30 segundos para devolver 70 registros.

No entiendo por qué la diferencia es tan grande.

Parece que el plan de ejecución diferente se elige para la declaración con el ID de usuario = 1 y diferente para ID de usuario = 2.

Después he implementado Oracle FIRST_ROW Indirecta, el rendimiento llegado a ser significativamente mejor. Ambas declaraciones (para ambos identificadores 1 y 2) producen retorno en menos de 1 segundo.

SELECT /*+ FIRST_ROWS */ 
     field1, field2, field3, ... 
FROM table1, table2, table3, table4, table5 
WHERE table1.id = table2.id AND table2.id = table3.id AND ... 
     table5.userid = 1 

Preguntas:
1) ¿Cuáles son las posibles razones para el mal rendimiento cuando userid = 2 (cuando no se utiliza pista)?
2) ¿Por qué el plan de ejecución sería diferente para una declaración frente a otra (cuando no se usa la sugerencia)?
3) ¿Hay algo de lo que deba tener cuidado cuando decida agregar esta sugerencia a mis consultas?

Gracias

+2

¿Están las estadísticas de su tabla actualizadas y precisas? – Tebbe

+0

tenga cuidado con el almacenamiento en caché al ejecutar comparaciones de rendimiento. – tbone

+0

Tebbe - Las estadísticas están actualizadas. Son precisos, no lo sé. – bobetko

Respuesta

8

1) ¿Cuáles son las posibles razones para el mal rendimiento cuando userid = 2 (cuando no se utiliza pista)?

Porque Oracle cree que uno de los conjuntos de resultados intermedios que utilizan el plan de (ID de usuario = 1) será muy grande, probablemente incorrecto.

2) ¿Por qué el plan de ejecución sería diferente para una declaración frente a otra (cuando no se usa la sugerencia)? índices basados ​​

histograma

3) ¿Hay algo que debería tener cuidado cuando se decida añadir esta receta a mis preguntas?

Mientras el número de registros que se devuelve es pequeña, esta receta debe ser failry seguro - a diferencia de empujar el optimizador de utilizar un índice específico, este enfoque permite a Oracle para elegir un plan diferente si se cambian los índices.

+0

Gracias por su rápida respuesta. Lo más desconcertante es que no tuvimos este problema durante 6 años hasta hace 1 mes (cuando nos actualizamos a una nueva versión de Oracle). Desde entonces, el rendimiento comenzó a empeorar (para algunos usuarios). ¿Hay alguna acción que se podría hacer en el servidor de Oracle para optimizar el rendimiento? Gracias. – bobetko

+0

¿Mantiene actualizada sus estadísticas?Sería bueno analizar realmente si necesita histogramas o no – Sebas

+0

¿Está utilizando variables vinculadas y se cambió a un DBMS con bind-peeking habilitado? – symcbean

Cuestiones relacionadas