Oracle
 sql >> Database >  >> RDS >> Oracle

ResultSet.next molto lento solo quando la query contiene la restrizione FIRST_ROWS o ROWNUM

Ottieni piani di query diversi quando includi il suggerimento? La mia ipotesi è che lo fai in base alla tua descrizione del problema.

Quando si esegue una query in Oracle, il database generalmente non materializza l'intero set di risultati in qualsiasi momento (ovviamente, potrebbe essere necessario se si specifica un ORDER BY clausola che richiede che tutti i dati siano materializzati prima che avvenga l'ordinamento). Oracle in realtà non inizia a materializzare i dati fino a quando il client non inizia a recuperare i dati. Esegue una quantità sufficiente della query per generare il numero di righe che il client ha chiesto di recuperare (che nel tuo caso sembra essere 10), restituisce quei risultati al client e attende che il client richieda più dati prima di continuare a elaborare il interrogazione.

Sembra quando il FIRST_ROWS suggerimento è incluso, il piano di query sta cambiando in modo da renderlo più costoso da eseguire. Ovviamente, questo non è l'obiettivo di FIRST_ROWS suggerimento. L'obiettivo è dire all'ottimizzatore di generare un piano che renda più efficiente il recupero delle prime N righe anche se rende meno efficiente il recupero di tutte le righe dalla query. Ciò tende a far sì che l'ottimizzatore preferisca cose come le scansioni degli indici rispetto alle scansioni della tabella in cui una scansione della tabella potrebbe essere complessivamente più efficiente. Sembra che nel tuo caso, tuttavia, le stime dell'ottimizzatore non siano corrette e finisca per scegliere un piano generalmente meno efficiente. Ciò implica spesso che alcune delle statistiche su alcuni degli oggetti a cui fa riferimento la query sono incomplete o errate.