Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Zbieranie zbiorcze PL/SQL z klauzulą ​​LIMIT w bazie danych Oracle

Zbieranie zbiorcze z klauzulą ​​LIMIT w bazie danych Oracle

Do tej pory dowiedzieliśmy się, jak poprawić wydajność zapytań za pomocą zbiorczego zbierania danych z SELECT-INTO, który używa niejawnego kursora i instrukcji FETCH-INTO jawnego kursora. Pozostaje jednak pytanie, czy jest jeszcze miejsce na dalszą optymalizację zapytań? W tym blogu dowiemy się, jak możemy jeszcze bardziej ulepszyć nasze zapytanie, korzystając z klauzuli Limit z gromadzeniem zbiorczym?

Poznaliśmy już proces kompresowania wielu przełączników przy użyciu funkcji zbierania zbiorczego z opcją select-into, co z kolei pozwala uzyskać większą kontrolę nad zapytaniem, używając tego samego z instrukcją fetch-in dla jawnego kursora. Ale nadal istnieje problem, który wymaga naszej uwagi, a mianowicie nadmierne wyczerpanie pamięci spowodowane gromadzeniem masowym.

Co rozumiesz przez nadmierne wyczerpanie pamięci spowodowane zbiorczym gromadzeniem danych?

Za każdym razem, gdy pobieramy lub pobieramy dużą liczbę rekordów za pomocą klauzuli zbiorczego zbierania danych, nasz program zaczyna zużywać dużo pamięci, aby być szybkim i wydajnym. To nie jest zwykłe wspomnienie. W przeciwieństwie do pamięci SGA, która jest współdzielona przez wszystkie sesje bazy danych Oracle, program zużywa pamięć PGA, która jest specjalnie przydzielona dla każdej sesji.

Pogarsza to wydajność bazy danych. Oznacza to, że nasze zapytanie z pewnością musi działać dobrze, ale w tym samym czasie nasza baza danych może nie.

Nie możemy mieć dobrze zoptymalizowanego zapytania, obniżając wydajność całej naszej bazy danych. Prawda?

Jak możemy rozwiązać ten problem wyczerpywania się pamięci przez gromadzenie zbiorcze?

Ten problem wyczerpania pamięci można łatwo przezwyciężyć, jeśli będziemy mogli kontrolować i ograniczać ilość danych pobieranych za pomocą zbierania zbiorczego. Możemy to zrobić, używając Bulk Collect z klauzulą ​​LIMIT.

Jaka jest składnia klauzuli LIMIT?

Klauzula LIMIT działa jako atrybut instrukcji FETCH-INTO:

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

Ponieważ LIMIT działa jako atrybut instrukcji FETCH-INTO, więc aby go użyć, możesz dodać słowo kluczowe LIMIT, po którym następuje określona cyfra liczbowa, która określi liczbę wierszy, które klauzula bulk-collect pobierze za jednym razem na końcu FETCH Oświadczenie -INTO.

Co robi klauzula LIMIT?

Klauzula LIMIT ogranicza liczbę wierszy pobieranych za pomocą instrukcji BULK COLLECT z instrukcją FETCH.

Czy możemy użyć klauzuli LIMIT z instrukcją SELECT-INTO?

Nie, nie możemy użyć klauzuli LIMIT z instrukcją SELECT-INTO. Klauzula LIMIT działa jako atrybut instrukcji FETCH-INTO, ponieważ klauzula LIMIT wymaga do działania jawnego kursora, a instrukcja FETCH-INTO jest częścią jawnego cyklu życia kursora.

Dlatego zawsze pamiętaj, że klauzula LIMIT może być używana tylko wtedy, gdy używasz BULK COLLECT z instrukcją FETCH-INTO. Nie można jej użyć, gdy używasz zbierania zbiorczego z instrukcją SELECT-INTO.

Przykład:jak używać klauzuli LIMIT z instrukcją Bulk Collect w bazie danych Oracle

Oto bardzo prosty przykład pokazujący, jak można pracować z 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;
/

Możesz zapoznać się z samouczkiem wideo na moim kanale YouTube, aby uzyskać szczegółowe wyjaśnienie powyższego kodu.

Więc tym razem zamiast pobierać wszystkie rekordy i wyczerpywać kosztowny zasób, taki jak pamięć, dzięki klauzuli LIMIT pobieramy tylko niezbędne wiersze i to również bez marnowania zasobów. W ten sposób możemy podnieść wydajność naszych zapytań dzięki zbieraniu zbiorczemu.

Więc teraz pytasz Manish, jaka jest właściwa liczba wierszy, które możemy pobrać?

W celu poznania odpowiedzi na to pytanie proponuję przeczytać ten blog mojego drogiego przyjaciela Stevena Feuersteina na stronie Oracle. Bardzo dobrze odpowiedział na to pytanie.

Również w tym podejściu jest pewien mankament, który polega na tym, że:jeśli ponownie wykonasz ten sam program, to instrukcja FETCH-INTO z klauzulą ​​LIMIT nie dołączy do kolekcji kolejnych 10 rekordów. Zamiast tego skróci tabelę i ponownie zapełni zagnieżdżoną tabelę z indeksu nr 1.

Mój drogi przyjaciel Connor McDonald napisał blog wyjaśniający, jak można rozwiązać ten problem za pomocą MULTISET. Śmiało i sprawdź jego artykuł.

To jest szczegółowy blog PL/SQL na temat używania klauzuli LIMIT z zbiorczym zbieraniem danych w Oracle Database. Mam nadzieję, że podobało Ci się czytanie, jeśli tak, udostępnij ten samouczek znajomym w mediach społecznościowych. Dziękuje za przeczytanie. Miłego dnia!


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Funkcja INITCAP() w Oracle

  2. Jak używać parametrów w klauzuli „where value in...”?

  3. Wykryj, czy wartość zawiera co najmniej jedną cyfrę w Oracle

  4. Najlepszy sposób na wstawianie wielu wierszy w Oracle?

  5. Jak utworzyć słaby kursor odniesienia PL/SQL w bazie danych Oracle