sql >> Databasteknik >  >> RDS >> Oracle

ResultSet.next mycket långsamt endast när frågan innehåller FIRST_ROWS eller ROWNUM begränsning

Får du olika frågeplaner när du inkluderar tipset? Mitt antagande är att du gör det utifrån din beskrivning av problemet.

När du kör en fråga i Oracle, realiserar databasen i allmänhet inte hela resultatuppsättningen vid någon tidpunkt (det kan naturligtvis behövas om du anger en ORDER BY klausul som kräver att all data materialiseras innan sorteringen sker). Oracle börjar faktiskt inte materialisera data förrän klienten börjar hämta data. Den kör tillräckligt mycket av frågan för att generera hur många rader klienten har bett om att hämta (vilket det låter som 10 i ditt fall), returnerar dessa resultat till klienten och väntar på att klienten ska begära mer data innan den fortsätter att bearbeta fråga.

Det låter som när FIRST_ROWS ledtråd ingår, frågeplanen förändras på ett sätt som gör det dyrare att köra. Uppenbarligen är det inte målet med FIRST_ROWS ledtråd. Målet är att tala om för optimeraren att generera en plan som gör hämtning av de första N raderna mer effektiv även om det gör hämtning av alla rader från frågan mindre effektivt. Det tenderar att få optimeraren att gynna saker som indexsökningar framför tabellskanningar där en tabellskanning kan vara mer effektiv överlag. Det låter som i ditt fall att optimerarens uppskattningar är felaktiga och det slutar med att den väljer en plan som generellt sett är mindre effektiv. Det innebär ofta att en del av statistiken för några av de objekt som din fråga refererar till är ofullständig eller felaktig.



  1. Tvinga klientnedkoppling med PostgreSQL

  2. generera XLS-filer med PL/SQL

  3. PostgREST / PostgreSQL Kan inte förstora strängbuffertmeddelande

  4. Returnera ett värde och en resultatuppsättning från lagrad procedure classic asp