Oracle
 sql >> Datenbank >  >> RDS >> Oracle

ResultSet.next nur sehr langsam, wenn die Abfrage FIRST_ROWS- oder ROWNUM-Beschränkung enthält

Erhalten Sie unterschiedliche Abfragepläne, wenn Sie den Hinweis einfügen? Ich gehe davon aus, dass Sie dies aufgrund Ihrer Beschreibung des Problems tun.

Wenn Sie eine Abfrage in Oracle ausführen, materialisiert die Datenbank im Allgemeinen zu keinem Zeitpunkt die gesamte Ergebnismenge (natürlich muss dies möglicherweise der Fall sein, wenn Sie einen ORDER BY angeben Klausel, die erfordert, dass alle Daten materialisiert werden, bevor die Sortierung erfolgt). Oracle beginnt erst dann mit der Materialisierung von Daten, wenn der Client mit dem Abrufen von Daten beginnt. Es führt genug von der Abfrage aus, um so viele Zeilen zu generieren, wie der Client angefordert hat (was in Ihrem Fall so klingt, als wären es 10), gibt diese Ergebnisse an den Client zurück und wartet darauf, dass der Client weitere Daten anfordert, bevor es mit der Verarbeitung fortfährt Abfrage.

Es klingt wie wenn die FIRST_ROWS Hinweis enthalten ist, ändert sich der Abfrageplan in einer Weise, die die Ausführung teurer macht. Offensichtlich ist das nicht das Ziel von FIRST_ROWS Hinweis. Das Ziel besteht darin, den Optimierer anzuweisen, einen Plan zu generieren, der das Abrufen der ersten N Zeilen effizienter macht, auch wenn das Abrufen aller Zeilen aus der Abfrage dadurch weniger effizient wird. Das führt tendenziell dazu, dass der Optimierer Dinge wie Index-Scans gegenüber Tabellen-Scans bevorzugt, bei denen ein Tabellen-Scan insgesamt effizienter sein könnte. Es hört sich so an, als ob in Ihrem Fall die Schätzungen des Optimierers falsch sind und er am Ende einen Plan auswählt, der im Allgemeinen nur weniger effizient ist. Dies bedeutet häufig, dass einige der Statistiken zu einigen Objekten, auf die Ihre Abfrage verweist, unvollständig oder falsch sind.