Oracle
 sql >> база данни >  >> RDS >> Oracle

PL/SQL групово събиране с клауза LIMIT в базата данни на Oracle

Групово събиране с клауза LIMIT в базата данни на Oracle

Досега научихме как да подобрим производителността на заявката, използвайки групово събиране с SELECT-INTO, което използва неявния курсор и израза FETCH-INTO на изричен курсор. Но остава въпросът дали все още има поле за по-нататъшно оптимизиране на заявките? В този блог ще научим как можем да подобрим допълнително нашата заявка, използвайки клаузата Limit с групово събиране?

Вече научихме процеса на компресиране на множество превключватели, като използваме групово събиране с select-into и на свой ред получаваме по-голям контрол върху заявката, като използваме същото с оператор за извличане в изричен курсор. Но все още има проблем, който изисква нашето внимание, а това е прекомерното изтощаване на паметта, причинено от насипно събиране.

Какво имаш предвид под прекомерно изтощаване на паметта, причинено от насипно събиране?

Всеки път, когато извличаме или извличаме голям брой записи, използвайки клауза за групово събиране, нашата програма започва да консумира много памет, за да бъде бърза и ефективна. Това не е просто някакъв спомен. За разлика от SGA паметта, която се споделя между всички сесии на Oracle Database, програмата консумира PGA паметта, която е специално разпределена за всяка сесия.

Това влошава производителността на базата данни. Това означава, че нашата заявка със сигурност трябва да работи добре, но в същото време нашата база данни може да не.

Не можем да имаме добре оптимизирана заявка, като компрометираме производителността на цялата ни база данни. Нали?

Как можем да решим този проблем с изчерпването на паметта чрез групово събиране?

Този проблем с изчерпването на паметта може лесно да бъде преодолян, ако можем да контролираме и ограничаваме количеството данни, извлечени с помощта на груповото събиране. Можем да направим това, като използваме групово събиране с клаузата LIMIT.

Какъв е синтаксисът на клаузата LIMIT?

Клаузата LIMIT работи като атрибут на израз FETCH-INTO:

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

Тъй като LIMIT работи като атрибут на оператора FETCH-INTO, за да го използвате, можете да добавите ключова дума LIMIT, последвана от конкретна цифрова цифра, която ще указва броя на редовете, които клаузата за групово събиране ще извлече наведнъж в края на FETCH -INTO изявление.

Какво прави клаузата LIMIT?

Клаузата LIMIT ограничава броя на редовете, извлечени чрез BULK COLLECT с израз FETCH.

Можем ли да използваме клаузата LIMIT с израза SELECT-INTO?

Не, не можем да използваме клаузата LIMIT с израза SELECT-INTO. Клаузата LIMIT работи като атрибут на израза FETCH-INTO, тъй като клаузата LIMIT изисква изричен курсор, за да работи, а изразът FETCH-INTO е част от изричния жизнен цикъл на курсора.

Така че винаги помнете, че клаузата LIMIT може да се използва само когато използвате BULK COLLECT с израз FETCH-INTO. Не може да се използва, когато използвате групово събиране с оператор SELECT-INTO.

Пример:Как да използвате клауза LIMIT с израз за групово събиране в Oracle Database

Ето един много прост пример, който ви показва как можете да работите с клаузата 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;
/

Можете да се обърнете към видеоурока в моя канал в YouTube за подробно обяснение на горния код.

Така че този път вместо да извличаме всички записи и да изчерпваме скъп ресурс като памет, благодарение на клаузата LIMIT, ние извличаме само необходимите редове и това също без загуба на ресурси. По този начин можем да подобрим ефективността на заявката си с групово събиране.

И така, сега питате Manish какво е точното количество редове, които можем да извлечем?

За да разберете отговора на този въпрос, ви предлагам да прочетете този блог от моя скъп приятел Стивън Фойерщайн на уебсайта на Oracle. Той отговори много добре на този въпрос.

Този подход също има недостатък и това е:Ако изпълните същата програма отново, тогава този израз FETCH-INTO с клауза LIMIT няма да добави колекцията със следващите 10 записа. По-скоро ще съкрати таблицата и ще попълни вложената таблица отново от индекс № 1.

Моят скъп приятел Конър Макдоналд направи блог, обясняващ как можете да преодолеете този проблем с помощта на MULTISET. Продължете и разгледайте статията му.

Това е подробният PL/SQL блог за това как да използвате клауза LIMIT с Bulk Collect в Oracle Database. Надяваме се, че ви е харесало да четете, ако е така, тогава не забравяйте да споделите този урок с приятелите си в социалните си медии. Благодаря за четенето. Приятен ден!


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Управление на прозорци в Oracle D2k Forms

  2. UNPIVOT върху неопределен брой колони

  3. AWS Python Lambda с Oracle

  4. sqlplus изявление от командния ред

  5. SQL вътрешно присъединяване при избрани изрази