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!