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

PL/SQL-masseindsamling med LIMIT-klausul i Oracle-databasen

Masseindsamling med LIMIT-klausul i Oracle-database

Indtil videre har vi lært, hvordan man forbedrer forespørgselsydeevnen ved at bruge bulk collect med SELECT-INTO, som bruger den implicitte markør og FETCH-INTO-sætningen af ​​en eksplicit markør. Men spørgsmålet er, om der stadig er mulighed for yderligere forespørgselsoptimering? I denne blog vil vi lære, hvordan vi kan forbedre vores forespørgsel yderligere ved at bruge Limit-klausulen med masseindsamling?

Vi har allerede lært processen med at komprimere flere switches ved at bruge bulk collect med select-in og igen få større kontrol over forespørgslen ved at bruge den samme med en fetch-into-sætning af en eksplicit markør. Men der er stadig et problem, som kræver vores opmærksomhed, og det er overdreven hukommelsesudmattelse forårsaget af masseindsamling.

Hvad mener du med overdreven hukommelsesudmattelse forårsaget af masseindsamling?

Hver gang vi henter eller henter et stort antal poster ved hjælp af bulk collect-klausulen, begynder vores program at forbruge en masse hukommelse for at være hurtig og effektiv. Dette er ikke et hvilket som helst minde. I modsætning til SGA-hukommelsen, der deles mellem alle sessionerne i Oracle Database, bruger programmet den PGA-hukommelse, der er specifikt tildelt til hver session.

Dette forringer databasens ydeevne. Det betyder, at vores forespørgsel helt sikkert skal fungere godt, men samtidig er det måske ikke vores database.

Vi kan ikke have en veloptimeret forespørgsel ved at kompromittere ydeevnen af ​​hele vores database. Ikke?

Hvordan kan vi løse dette problem med hukommelsesudmattelse ved masseindsamling?

Dette problem med hukommelsesudmattelse kan nemt overvindes, hvis vi kan kontrollere og begrænse mængden af ​​data, der hentes ved hjælp af masseindsamlingen. Det kan vi gøre ved at bruge Bulk Collect med LIMIT-klausulen.

Hvad er syntaksen for LIMIT-sætningen?

LIMIT-sætning fungerer som en attribut for en FETCH-INTO-sætning:

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

Da LIMIT fungerer som en attribut for FETCH-INTO-sætningen, og for at bruge den kan du tilføje nøgleordet LIMIT efterfulgt af et specifikt numerisk ciffer, som vil specificere antallet af rækker, som bulk-collect-sætningen vil hente på én gang i slutningen af ​​FETCH -INTO-erklæring.

Hvad gør LIMIT-klausulen?

LIMIT-sætning begrænser antallet af rækker, der hentes ved hjælp af BULK COLLECT med FETCH-sætning.

Kan vi bruge LIMIT-sætningen med SELECT-INTO-sætningen?

Nej, vi kan ikke bruge LIMIT-sætningen med SELECT-INTO-sætningen. LIMIT-sætning fungerer som en attribut til FETCH-INTO-sætningen, fordi LIMIT-sætning kræver en eksplicit cursor for at fungere, og FETCH-INTO-sætning er en del af eksplicit cursor-livscyklus.

Så husk altid, at LIMIT-sætningen kun kan bruges, når du bruger BULK COLLECT med FETCH-INTO-sætning. Det kan ikke bruges, når du bruger masseindsamling med SELECT-INTO-sætning.

Eksempel:Sådan bruges LIMIT-klausul med Bulk Collect-sætning i Oracle-databasen

Her er et meget simpelt eksempel, der viser dig, hvordan du kan arbejde med LIMIT-sætningen.

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;
/

Du kan se videovejledningen på min YouTube-kanal for en detaljeret forklaring af ovenstående kode.

Så denne gang i stedet for at hente alle posterne og udtømme en dyr ressource som hukommelse, takket være LIMIT-klausulen, henter vi kun de nødvendige rækker og det også uden ressourcespild. På denne måde kan vi tage vores forespørgselsydeevne et trin højere med masseindsamling.

Så nu spørger du, Manish, hvad er det rigtige antal rækker, vi kan hente?

For at kende svaret på dette spørgsmål foreslår jeg, at du læser denne blog af min kære ven Steven Feuerstein på Oracles hjemmeside. Han har svaret rigtig godt på dette spørgsmål.

Der er også en mangel ved denne tilgang, og det er:Hvis du udfører det samme program igen, vil denne FETCH-INTO-sætning med LIMIT-sætning ikke tilføje samlingen med de næste 10 poster. Det vil snarere afkorte tabellen og udfylde den indlejrede tabel igen fra indeks nr.1.

Min kære ven Connor McDonald har lavet en blog, der forklarer, hvordan du kan overvinde dette problem ved at bruge MULTISET. Gå videre og tjek hans artikel.

Det er den detaljerede PL/SQL-blog om, hvordan man bruger LIMIT-klausulen med Bulk Collect i Oracle Database. Håber du nød at læse, hvis ja, så sørg for at dele denne tutorial med dine venner på dine sociale medier. Tak fordi du læste med. Hav en god dag!


  1. understøtter rails postgres adapter ssl?

  2. Forespørgselsfejl med tvetydigt kolonnenavn i SQL

  3. Indsæt billede i SQL Server 2005 Image Field kun ved brug af SQL

  4. Sådan slettes identitetsegenskaber for en kolonne i SQL Server-tabel - SQL Server / T-SQL vejledning 44