Oracle
 sql >> Base de données >  >> RDS >> Oracle

ResultSet.next très lent uniquement lorsque la requête contient la restriction FIRST_ROWS ou ROWNUM

Obtenez-vous différents plans de requête lorsque vous incluez l'indice ? Mon hypothèse est que vous le faites en fonction de votre description du problème.

Lorsque vous exécutez une requête dans Oracle, la base de données ne matérialise généralement pas l'ensemble des résultats à tout moment (évidemment, cela peut être nécessaire si vous spécifiez un ORDER BY clause qui exige que toutes les données soient matérialisées avant que le tri ne se produise). Oracle ne commence pas à matérialiser les données tant que le client n'a pas commencé à récupérer les données. Il exécute suffisamment de requêtes pour générer le nombre de lignes que le client a demandé de récupérer (ce qui semble être 10 dans votre cas), renvoie ces résultats au client et attend que le client demande plus de données avant de continuer à traiter le requête.

Cela ressemble à quand le FIRST_ROWS indice est inclus, le plan de requête change d'une manière qui rend son exécution plus coûteuse. Évidemment, ce n'est pas le but de la FIRST_ROWS indice. L'objectif est de dire à l'optimiseur de générer un plan qui rend la récupération des N premières lignes plus efficace même si cela rend la récupération de toutes les lignes de la requête moins efficace. Cela a tendance à amener l'optimiseur à privilégier des éléments tels que les analyses d'index par rapport aux analyses de table, où une analyse de table peut être globalement plus efficace. Il semble que dans votre cas, cependant, les estimations de l'optimiseur soient incorrectes et il finit par choisir un plan qui est généralement moins efficace. Cela implique souvent que certaines des statistiques sur certains des objets auxquels votre requête fait référence sont incomplètes ou incorrectes.