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
¿Están las estadísticas de su tabla actualizadas y precisas? – Tebbe
tenga cuidado con el almacenamiento en caché al ejecutar comparaciones de rendimiento. – tbone
Tebbe - Las estadísticas están actualizadas. Son precisos, no lo sé. – bobetko