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

ResultSet.next muy lento solo cuando la consulta contiene restricciones FIRST_ROWS o ROWNUM

¿Obtiene diferentes planes de consulta cuando incluye la sugerencia? Mi suposición es que lo hace en función de su descripción del problema.

Cuando ejecuta una consulta en Oracle, la base de datos generalmente no materializa el conjunto de resultados completo en ningún momento (obviamente, puede que tenga que hacerlo si especifica un ORDER BY cláusula que requiere que todos los datos se materialicen antes de que ocurra la clasificación). Oracle en realidad no comienza a materializar datos hasta que el cliente comienza a buscar datos. Ejecuta una cantidad suficiente de la consulta para generar la cantidad de filas que el cliente haya solicitado obtener (lo que parece ser 10 en su caso), devuelve esos resultados al cliente y espera a que el cliente solicite más datos antes de continuar procesando el consulta.

Suena como cuando FIRST_ROWS se incluye una sugerencia, el plan de consulta está cambiando de una manera que hace que su ejecución sea más costosa. Obviamente, ese no es el objetivo de FIRST_ROWS insinuación. El objetivo es decirle al optimizador que genere un plan que haga que la obtención de las primeras N filas sea más eficiente, incluso si hace que la obtención de todas las filas de la consulta sea menos eficiente. Eso tiende a hacer que el optimizador favorezca cosas como escaneos de índice sobre escaneos de tablas donde un escaneo de tablas podría ser más eficiente en general. Sin embargo, parece que en su caso, las estimaciones del optimizador son incorrectas y termina eligiendo un plan que generalmente es menos eficiente. Eso implica con frecuencia que algunas de las estadísticas de algunos de los objetos a los que hace referencia su consulta están incompletas o son incorrectas.