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

Raccolta in blocco PL/SQL con clausola LIMIT nel database Oracle

Collegamento collettivo con clausola LIMIT in Oracle Database

Finora abbiamo appreso come migliorare le prestazioni delle query utilizzando la raccolta in blocco con SELECT-INTO che utilizza il cursore implicito e l'istruzione FETCH-INTO di un cursore esplicito. Ma la domanda rimane:c'è ancora spazio per un'ulteriore ottimizzazione delle query? In questo blog impareremo come possiamo migliorare ulteriormente la nostra query utilizzando la clausola Limit con raccolta in blocco?

Abbiamo già appreso il processo di compressione di più opzioni utilizzando la raccolta in blocco con select-in e, a sua volta, ottenere un maggiore controllo sulla query utilizzando la stessa con un'istruzione fetch-in di un cursore esplicito. Ma c'è ancora un problema che richiede la nostra attenzione ed è l'eccessivo esaurimento della memoria causato dal bulk collect.

Cosa intendi per eccessivo esaurimento della memoria causato dalla raccolta in blocco?

Ogni volta che recuperiamo o recuperiamo un numero elevato di record utilizzando la clausola di raccolta in blocco, il nostro programma inizia a consumare molta memoria per essere veloce ed efficiente. Questo non è un ricordo qualsiasi. A differenza della memoria SGA condivisa tra tutte le sessioni di Oracle Database, il programma consuma la memoria PGA specificatamente allocata per ciascuna sessione.

Ciò degrada le prestazioni del database. Ciò significa che la nostra query deve sicuramente funzionare bene ma, allo stesso tempo, il nostro database potrebbe non funzionare.

Non possiamo avere una query ben ottimizzata compromettendo le prestazioni dell'intero database. Giusto?

Come possiamo risolvere questo problema di esaurimento della memoria dovuto alla raccolta in blocco?

Questo problema dell'esaurimento della memoria può essere facilmente superato se riusciamo a controllare e limitare la quantità di dati recuperati utilizzando la raccolta in blocco. Possiamo farlo utilizzando Bulk Collect con la clausola LIMIT.

Qual ​​è la sintassi della clausola LIMIT?

La clausola LIMIT funziona come un attributo di un'istruzione FETCH-INTO:

FETCH <cursor_name> BULK COLLECT INTO <plsql_collection> LIMIT number;

Poiché LIMIT funziona come un attributo dell'istruzione FETCH-INTO, quindi per utilizzarlo è possibile aggiungere la parola chiave LIMIT seguita da una cifra numerica specifica che specificherà il numero di righe che la clausola bulk-collect recupererà in una volta sola alla fine di FETCH -istruzione INTO.

Cosa fa la clausola LIMIT?

La clausola LIMIT limita il numero di righe recuperate utilizzando BULK COLLECT con l'istruzione FETCH.

Possiamo usare la clausola LIMIT con l'istruzione SELECT-INTO?

No, non possiamo usare la clausola LIMIT con l'istruzione SELECT-INTO. La clausola LIMIT funziona come un attributo dell'istruzione FETCH-INTO perché la clausola LIMIT richiede un cursore esplicito per funzionare e l'istruzione FETCH-INTO fa parte del ciclo di vita esplicito del cursore.

Quindi ricorda sempre che la clausola LIMIT può essere utilizzata solo quando stai utilizzando BULK COLLECT con l'istruzione FETCH-INTO. Non può essere utilizzato quando si utilizza la raccolta in blocco con l'istruzione SELECT-INTO.

Esempio:come utilizzare la clausola LIMIT con l'istruzione Bulk Collect in Oracle Database

Ecco un esempio molto semplice che ti mostra come puoi lavorare con la clausola LIMIT.

SET SERVEROUTPUT ON;
DECLARE
    CURSOR exp_cur IS
    SELECT first_name FROM employees;
    
    TYPE nt_fName   IS TABLE OF VARCHAR2(20);
    fname   nt_fName;
BEGIN
    OPEN exp_cur;
    FETCH exp_cur   BULK COLLECT INTO fname     LIMIT 10;
    CLOSE exp_cur;
    --Print data
    FOR idx IN 1 .. fname.COUNT
    LOOP
        DBMS_OUTPUT.PUT_LINE (idx||' '||fname(idx) );
    END LOOP;
END;
/

Puoi fare riferimento al video tutorial sul mio canale YouTube per la spiegazione dettagliata del codice sopra.

Quindi questa volta invece di recuperare tutti i record ed esaurire una risorsa costosa come la memoria, grazie alla clausola LIMIT, stiamo recuperando solo le righe necessarie e anche quelle senza spreco di risorse. In questo modo possiamo aumentare le prestazioni delle nostre query con la raccolta in blocco.

Quindi ora chiedi, Manish, qual è la giusta quantità di righe che possiamo recuperare?

Per conoscere la risposta a questa domanda ti consiglio di leggere questo blog del mio caro amico Steven Feuerstein sul sito di Oracle. Ha risposto molto bene a questa domanda.

C'è anche un difetto con questo approccio e cioè:se si esegue di nuovo lo stesso programma, questa istruzione FETCH-INTO con clausola LIMIT non aggiungerà la raccolta con i prossimi 10 record. Piuttosto, troncherà la tabella e popolerà nuovamente la tabella nidificata dall'indice n. 1.

Il mio caro amico Connor McDonald ha realizzato un blog in cui spiega come superare questo problema utilizzando MULTISET. Vai avanti e controlla il suo articolo.

Questo è il blog dettagliato di PL/SQL su come utilizzare la clausola LIMIT con Bulk Collect in Oracle Database. Spero ti sia piaciuto leggere, in tal caso assicurati di condividere questo tutorial con i tuoi amici sui tuoi social media. Grazie per aver letto. Buona giornata!