sql >> Databáze >  >> RDS >> Oracle

Hromadný sběr PL/SQL s doložkou LIMIT v databázi Oracle

Hromadné shromažďování pomocí klauzule LIMIT v databázi Oracle

Dosud jsme se naučili, jak zlepšit výkon dotazů pomocí hromadného shromažďování s SELECT-INTO, který používá implicitní kurzor a příkaz FETCH-INTO explicitního kurzoru. Otázkou však zůstává, zda je zde ještě prostor pro další optimalizaci dotazů? V tomto blogu se dozvíme, jak můžeme dále zlepšit náš dotaz pomocí klauzule Limit s hromadným sběrem?

Již jsme se naučili proces komprese více přepínačů pomocí hromadného shromažďování s funkcí select-into a zase získali větší kontrolu nad dotazem pomocí stejného příkazu s explicitním kurzorem pro načtení. Stále však existuje problém, který vyžaduje naši pozornost, a tím je nadměrné vyčerpání paměti způsobené hromadným sběrem.

Co myslíte nadměrným vyčerpáním paměti způsobené hromadným shromažďováním?

Kdykoli načteme nebo načteme velké množství záznamů pomocí klauzule hromadného sběru, náš program začne spotřebovávat hodně paměti, aby byl rychlý a efektivní. To není jen tak ledajaká vzpomínka. Na rozdíl od paměti SGA, která je sdílena všemi relacemi databáze Oracle, program spotřebovává paměť PGA, která je pro každou relaci specificky přidělena.

To snižuje výkon databáze. To znamená, že náš dotaz musí jistě fungovat dobře, ale zároveň naše databáze nemusí.

Nemůžeme mít dobře optimalizovaný dotaz tím, že ohrozíme výkon celé naší databáze. Správně?

Jak můžeme vyřešit tento problém vyčerpání paměti hromadným sběrem?

Tento problém vyčerpání paměti lze snadno překonat, pokud můžeme kontrolovat a omezit množství dat načítaných pomocí hromadného sběru. Můžeme to udělat pomocí Bulk Collect s klauzulí LIMIT.

Jaká je syntaxe klauzule LIMIT?

Klauzule LIMIT funguje jako atribut příkazu FETCH-INTO:

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

Protože LIMIT funguje jako atribut příkazu FETCH-INTO, pro jeho použití můžete přidat klíčové slovo LIMIT následované specifickou číselnou číslicí, která určí počet řádků, které klauzule hromadného sběru načte najednou na konci FETCH. -Do prohlášení.

Co dělá klauzule LIMIT?

Klauzule LIMIT omezuje počet řádků načtených pomocí příkazu BULK COLLECT s příkazem FETCH.

Můžeme použít klauzuli LIMIT s příkazem SELECT-INTO?

Ne, nemůžeme použít klauzuli LIMIT s příkazem SELECT-INTO. Klauzule LIMIT funguje jako atribut příkazu FETCH-INTO, protože klauzule LIMIT vyžaduje ke svému fungování explicitní kurzor a příkaz FETCH-INTO je součástí explicitního životního cyklu kurzoru.

Vždy si tedy pamatujte, že klauzuli LIMIT lze použít pouze tehdy, když používáte BULK COLLECT s příkazem FETCH-INTO. Nelze jej použít, když používáte hromadné shromažďování s příkazem SELECT-INTO.

Příklad:Jak používat klauzuli LIMIT s příkazem Bulk Collect v databázi Oracle

Zde je velmi jednoduchý příklad, který vám ukáže, jak můžete pracovat s klauzulí 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;
/

Podrobné vysvětlení výše uvedeného kódu naleznete ve výukovém videu na mém kanálu YouTube.

Takže tentokrát místo načítání všech záznamů a vyčerpání drahého zdroje, jako je paměť, díky klauzuli LIMIT získáváme pouze nezbytné řádky a to také bez plýtvání zdroji. Tímto způsobem můžeme pomocí hromadného shromažďování posunout výkon dotazů o stupeň výše.

Takže se nyní ptáte:Manishi, jaké je správné množství řádků, které můžeme načíst?

Abyste znali odpověď na tuto otázku, doporučuji vám přečíst si tento blog mého drahého přítele Stevena Feuersteina na webu Oracle. Na tuto otázku odpověděl opravdu dobře.

Tento přístup má také nedostatek, a to:Pokud znovu spustíte stejný program, pak tento příkaz FETCH-INTO s klauzulí LIMIT nepřipojí kolekci o dalších 10 záznamů. Spíše zkrátí tabulku a znovu naplní vnořenou tabulku z indexu č. 1.

Můj drahý přítel Connor McDonald vytvořil blog, ve kterém vysvětluje, jak můžete tento problém překonat pomocí MULTISET. Pokračujte a podívejte se na jeho článek.

To je podrobný blog PL/SQL o tom, jak používat klauzuli LIMIT s Bulk Collect v Oracle Database. Doufám, že se vám čtení líbilo, pokud ano, nezapomeňte tento návod sdílet se svými přáteli na svých sociálních sítích. Děkuji za přečtení. Krásný den!


  1. Jak změním formát data v Postgres?

  2. Migrace databází SQL pomocí příkazového řádku

  3. Proč cast/konvertovat z int vrátí hvězdičku

  4. Jak replikovat data PostgreSQL na vzdálené weby