Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

ResultSet.next muito lento apenas quando a consulta contém restrição FIRST_ROWS ou ROWNUM


Você obtém planos de consulta diferentes quando inclui a dica? Minha suposição é que você faz com base em sua descrição do problema.

Quando você executa uma consulta no Oracle, o banco de dados geralmente não materializa todo o conjunto de resultados em nenhum momento (obviamente, pode ser necessário se você especificar um ORDER BY cláusula que exige que todos os dados sejam materializados antes que a classificação aconteça). O Oracle não começa a materializar dados até que o cliente comece a buscar dados. Ele executa o suficiente da consulta para gerar quantas linhas o cliente pediu para buscar (o que parece ser 10 no seu caso), retorna esses resultados para o cliente e espera que o cliente solicite mais dados antes de continuar processando o consulta.

Parece que quando o FIRST_ROWS dica é incluída, o plano de consulta está mudando de uma forma que torna sua execução mais cara. Obviamente, esse não é o objetivo do FIRST_ROWS dica. O objetivo é dizer ao otimizador para gerar um plano que torne a busca das primeiras N linhas mais eficiente, mesmo que torne a busca de todas as linhas da consulta menos eficiente. Isso tende a fazer com que o otimizador favoreça coisas como varreduras de índice sobre varreduras de tabela, onde uma varredura de tabela pode ser mais eficiente em geral. Parece que no seu caso, no entanto, as estimativas do otimizador estão incorretas e ele acaba escolhendo um plano que geralmente é menos eficiente. Isso frequentemente implica que algumas das estatísticas de alguns dos objetos que sua consulta está referenciando estão incompletas ou incorretas.