Oracle
 sql >> Base de données >  >> RDS >> Oracle

Collecte en masse PL/SQL avec la clause LIMIT dans la base de données Oracle

Collecte en masse avec la clause LIMIT dans la base de données Oracle

Jusqu'à présent, nous avons appris à améliorer les performances des requêtes en utilisant la collecte en bloc avec SELECT-INTO qui utilise le curseur implicite et l'instruction FETCH-INTO d'un curseur explicite. Mais la question demeure :est-il encore possible d'optimiser davantage les requêtes ? Dans ce blog, nous apprendrons comment améliorer encore notre requête en utilisant la clause Limit avec la collecte en masse ?

Nous avons déjà appris le processus de compression de plusieurs commutateurs en utilisant la collecte en bloc avec select-into et en obtenant à son tour un meilleur contrôle sur la requête en utilisant la même chose avec une instruction fetch-into d'un curseur explicite. Mais il y a toujours un problème qui requiert notre attention et c'est l'épuisement excessif de la mémoire causé par la collecte en masse.

Qu'entendez-vous par épuisement excessif de la mémoire causé par une collecte groupée ?

Chaque fois que nous récupérons ou récupérons un grand nombre d'enregistrements à l'aide de la clause de collecte en bloc, notre programme commence à consommer beaucoup de mémoire afin d'être rapide et efficace. Ce n'est pas n'importe quel souvenir. Contrairement à la mémoire SGA qui est partagée entre toutes les sessions d'Oracle Database, le programme consomme la mémoire PGA qui est spécifiquement allouée pour chaque session.

Cela dégrade les performances de la base de données. Cela signifie que notre requête doit sûrement fonctionner correctement, mais en même temps, notre base de données peut ne pas l'être.

Nous ne pouvons pas avoir une requête bien optimisée en compromettant les performances de l'ensemble de notre base de données. N'est-ce pas ?

Comment pouvons-nous résoudre ce problème d'épuisement de la mémoire par la collecte en masse ?

Ce problème d'épuisement de la mémoire peut facilement être surmonté si nous pouvons contrôler et limiter la quantité de données récupérées à l'aide de la collecte en masse. Nous pouvons le faire en utilisant Bulk Collect avec la clause LIMIT.

Quelle est la syntaxe de la clause LIMIT ?

La clause LIMIT fonctionne comme un attribut d'une instruction FETCH-INTO :

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

Comme LIMIT fonctionne comme un attribut de l'instruction FETCH-INTO, pour l'utiliser, vous pouvez ajouter le mot-clé LIMIT suivi d'un chiffre numérique spécifique qui spécifiera le nombre de lignes que la clause bulk-collect récupérera en une seule fois à la fin de FETCH -Instruction INTO.

Que fait la clause LIMIT ?

La clause LIMIT limite le nombre de lignes extraites à l'aide de BULK COLLECT avec l'instruction FETCH.

Pouvons-nous utiliser la clause LIMIT avec l'instruction SELECT-INTO ?

Non, nous ne pouvons pas utiliser la clause LIMIT avec l'instruction SELECT-INTO. La clause LIMIT fonctionne comme un attribut de l'instruction FETCH-INTO car la clause LIMIT nécessite un curseur explicite pour fonctionner et l'instruction FETCH-INTO fait partie du cycle de vie du curseur explicite.

Rappelez-vous donc toujours que la clause LIMIT ne peut être utilisée que lorsque vous utilisez BULK COLLECT avec l'instruction FETCH-INTO. Il ne peut pas être utilisé lorsque vous utilisez la collecte en masse avec l'instruction SELECT-INTO.

Exemple :Comment utiliser la clause LIMIT avec l'instruction Bulk Collect dans Oracle Database

Voici un exemple très simple vous montrant comment vous pouvez travailler avec la clause 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;
/

Vous pouvez vous référer au didacticiel vidéo sur ma chaîne YouTube pour l'explication détaillée du code ci-dessus.

Ainsi, cette fois, au lieu de récupérer tous les enregistrements et d'épuiser une ressource coûteuse comme la mémoire, grâce à la clause LIMIT, nous ne récupérons que les lignes nécessaires et cela sans aucun gaspillage de ressources. De cette façon, nous pouvons optimiser les performances de nos requêtes grâce à la collecte groupée.

Alors maintenant, vous demandez, Manish, quelle est la bonne quantité de lignes que nous pouvons récupérer ?

Afin de connaître la réponse à cette question je vous propose de lire ce blog de mon cher ami Steven Feuerstein sur le site d'Oracle. Il a très bien répondu à cette question.

Il y a aussi une lacune avec cette approche et c'est :si vous exécutez à nouveau ce même programme, alors cette instruction FETCH-INTO avec la clause LIMIT n'ajoutera pas la collection avec les 10 prochains enregistrements. Au contraire, il tronquera la table et remplira à nouveau la table imbriquée à partir de l'index n° 1.

Mon cher ami Connor McDonald a créé un blog expliquant comment vous pouvez surmonter ce problème en utilisant MULTISET. Allez-y et consultez son article.

Il s'agit du blog PL/SQL détaillé sur l'utilisation de la clause LIMIT avec Bulk Collect dans Oracle Database. J'espère que vous avez apprécié la lecture, si c'est le cas, assurez-vous de partager ce tutoriel avec vos amis sur vos réseaux sociaux. Merci d'avoir lu. Bonne journée !