sql >> Database >  >> RDS >> Oracle

ResultSet.next alleen erg traag als de query FIRST_ROWS of ROWNUM-beperking bevat

Krijgt u verschillende queryplannen wanneer u de hint opneemt? Mijn veronderstelling is dat u dat doet op basis van uw beschrijving van het probleem.

Wanneer u een query uitvoert in Oracle, zal de database over het algemeen op geen enkel moment de volledige resultatenset tot stand brengen (uiteraard moet dit mogelijk zijn als u een ORDER BY opgeeft clausule die vereist dat alle gegevens worden gematerialiseerd voordat de sortering plaatsvindt). Oracle begint pas met het materialiseren van gegevens als de klant begint met het ophalen van gegevens. Het voert genoeg van de query uit om het aantal rijen te genereren dat de client heeft gevraagd om op te halen (wat in uw geval 10 klinkt), retourneert die resultaten naar de client en wacht tot de client meer gegevens opvraagt ​​voordat hij doorgaat met het verwerken van de vraag.

Het klinkt alsof de FIRST_ROWS hint is opgenomen, verandert het queryplan op een manier die het duurder maakt om uit te voeren. Dat is duidelijk niet het doel van de FIRST_ROWS hint. Het doel is om de optimizer te vertellen om een ​​plan te genereren dat het ophalen van de eerste N rijen efficiënter maakt, zelfs als het het ophalen van alle rijen uit de query minder efficiënt maakt. Dat heeft de neiging ertoe te leiden dat de optimizer zaken als indexscans verkiest boven tabelscans, waarbij een tabelscan over het algemeen efficiënter kan zijn. Het klinkt alsof in uw geval de schattingen van de optimizer onjuist zijn en uiteindelijk een plan kiest dat over het algemeen minder efficiënt is. Dat betekent vaak dat sommige statistieken over sommige objecten waarnaar uw zoekopdracht verwijst, onvolledig of onjuist zijn.



  1. Bewaar resultaat van min-query met meerdere kolommen in een variabele in Oracle PL/SQL

  2. verander de status van de Oracle-gebruikersaccount van EXPIRE(GRACE) in OPEN

  3. Rails scope voor IS NOT NULL en is niet leeg/leeg?

  4. Hoe kan ik een rollback detecteren in de MySQL-opgeslagen procedure?