Oracle
 sql >> Datenbank >  >> RDS >> Oracle

PL/SQL-Massenerfassung mit LIMIT-Klausel in der Oracle-Datenbank

Massenerfassung mit LIMIT-Klausel in Oracle-Datenbank

Bisher haben wir gelernt, wie die Abfrageleistung durch Massenerfassung mit SELECT-INTO verbessert werden kann, das den impliziten Cursor und die FETCH-INTO-Anweisung eines expliziten Cursors verwendet. Aber es bleibt die Frage, ob es noch Spielraum für eine weitere Abfrageoptimierung gibt? In diesem Blog erfahren wir, wie wir unsere Abfrage mithilfe der Limit-Klausel mit Massenerfassung weiter verbessern können?

Wir haben bereits den Prozess des Komprimierens mehrerer Schalter durch die Verwendung von Bulk Collect mit select-in erlernt und wiederum eine bessere Kontrolle über die Abfrage erhalten, indem wir dieselbe mit einer Fetch-in-Anweisung eines expliziten Cursors verwenden. Aber es gibt immer noch ein Problem, das unsere Aufmerksamkeit erfordert, und das ist eine übermäßige Speichererschöpfung, die durch die Massenerfassung verursacht wird.

Was meinen Sie mit übermäßiger Speichererschöpfung durch Massenerfassung?

Immer wenn wir eine große Anzahl von Datensätzen mithilfe der Massenerfassungsklausel abrufen oder abrufen, beginnt unser Programm, viel Speicher zu verbrauchen, um schnell und effizient zu sein. Das ist nicht irgendeine Erinnerung. Im Gegensatz zum SGA-Speicher, der von allen Sitzungen der Oracle-Datenbank gemeinsam genutzt wird, verbraucht das Programm den PGA-Speicher, der jeder Sitzung speziell zugewiesen wird.

Dadurch wird die Leistung der Datenbank beeinträchtigt. Das bedeutet, dass unsere Abfrage sicherlich gut funktionieren muss, aber gleichzeitig unsere Datenbank möglicherweise nicht.

Wir können keine gut optimierte Abfrage haben, indem wir die Leistung unserer gesamten Datenbank beeinträchtigen. Richtig?

Wie können wir dieses Problem der Speichererschöpfung durch Massenerfassung lösen?

Dieses Problem der Speichererschöpfung kann leicht überwunden werden, wenn wir die mit der Massenerfassung abgerufene Datenmenge kontrollieren und einschränken können. Wir können dies tun, indem wir Bulk Collect mit der LIMIT-Klausel verwenden.

Wie lautet die Syntax der LIMIT-Klausel?

Die LIMIT-Klausel funktioniert als Attribut einer FETCH-INTO-Anweisung:

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

Da LIMIT als Attribut der FETCH-INTO-Anweisung fungiert, können Sie zur Verwendung das Schlüsselwort LIMIT gefolgt von einer bestimmten numerischen Ziffer hinzufügen, die die Anzahl der Zeilen angibt, die die Bulk-Collect-Klausel am Ende von FETCH auf einmal abrufen wird -INTO-Anweisung.

Was bewirkt die LIMIT-Klausel?

Die LIMIT-Klausel beschränkt die Anzahl der Zeilen, die mit BULK COLLECT mit der FETCH-Anweisung abgerufen werden.

Können wir die LIMIT-Klausel mit der SELECT-INTO-Anweisung verwenden?

Nein, wir können die LIMIT-Klausel nicht mit der SELECT-INTO-Anweisung verwenden. Die LIMIT-Klausel fungiert als Attribut für die FETCH-INTO-Anweisung, da die LIMIT-Klausel einen expliziten Cursor benötigt, um zu funktionieren, und die FETCH-INTO-Anweisung Teil des expliziten Cursor-Lebenszyklus ist.

Denken Sie also immer daran, dass die LIMIT-Klausel nur verwendet werden kann, wenn Sie BULK COLLECT mit der Anweisung FETCH-INTO verwenden. Es kann nicht verwendet werden, wenn Sie die Massenerfassung mit der Anweisung SELECT-INTO verwenden.

Beispiel:Verwendung der LIMIT-Klausel mit der Bulk-Collect-Anweisung in der Oracle-Datenbank

Hier ist ein sehr einfaches Beispiel, das Ihnen zeigt, wie Sie mit der LIMIT-Klausel arbeiten können.

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

Sie können sich auf das Video-Tutorial auf meinem YouTube-Kanal beziehen, um eine detaillierte Erklärung des obigen Codes zu erhalten.

Anstatt also alle Datensätze abzurufen und eine teure Ressource wie Speicher zu erschöpfen, rufen wir diesmal dank der LIMIT-Klausel nur die erforderlichen Zeilen ab, und das auch noch ohne Ressourcenverschwendung. Auf diese Weise können wir unsere Abfrageleistung mit der Massenerfassung verbessern.

Also fragst du jetzt, Manish, was ist die richtige Anzahl an Zeilen, die wir abrufen können?

Um die Antwort auf diese Frage zu erfahren, empfehle ich Ihnen, diesen Blog meines lieben Freundes Steven Feuerstein auf der Website von Oracle zu lesen. Er hat diese Frage wirklich gut beantwortet.

Auch bei diesem Ansatz gibt es einen Mangel, und zwar:Wenn Sie dasselbe Programm erneut ausführen, wird diese FETCH-INTO-Anweisung mit der LIMIT-Klausel die Sammlung nicht mit den nächsten 10 Datensätzen anhängen. Stattdessen wird die Tabelle abgeschnitten und die verschachtelte Tabelle ab dem Index Nr. 1 erneut gefüllt.

Mein lieber Freund Connor McDonald hat einen Blog geschrieben, in dem erklärt wird, wie Sie dieses Problem mit MULTISET lösen können. Gehen Sie weiter und lesen Sie seinen Artikel.

Das ist der ausführliche PL/SQL-Blog zur Verwendung der LIMIT-Klausel mit Bulk Collect in Oracle Database. Ich hoffe, Sie haben das Lesen genossen, wenn ja, dann teilen Sie dieses Tutorial unbedingt mit Ihren Freunden in Ihren sozialen Medien. Danke fürs Lesen. Ich wünsche Ihnen einen schönen Tag!