sql >> Base de Datos >  >> RDS >> Oracle

Recopilación masiva de PL/SQL con cláusula LIMIT en base de datos Oracle

Recopilación masiva con cláusula LIMIT en base de datos Oracle

Hasta ahora, hemos aprendido cómo mejorar el rendimiento de las consultas mediante la recopilación masiva con SELECT-INTO, que usa el cursor implícito y la instrucción FETCH-INTO de un cursor explícito. Pero la pregunta sigue siendo si todavía hay margen para una mayor optimización de consultas. En este blog, aprenderemos cómo podemos mejorar aún más nuestra consulta utilizando la cláusula Limit con recolección masiva.

Ya aprendimos el proceso de comprimir varios conmutadores mediante el uso de recopilación masiva con select-into y, a su vez, obtenemos un mayor control sobre la consulta al usar el mismo con una instrucción fetch-into de un cursor explícito. Pero todavía hay un problema que requiere nuestra atención y es el agotamiento excesivo de la memoria causado por la recopilación masiva.

¿Qué quiere decir con agotamiento excesivo de la memoria causado por la recopilación masiva?

Cada vez que recuperamos o recuperamos una gran cantidad de registros utilizando la cláusula de recopilación masiva, nuestro programa comienza a consumir mucha memoria para ser rápido y eficiente. Este no es un recuerdo cualquiera. A diferencia de la memoria SGA que se comparte entre todas las sesiones de Oracle Database, el programa consume la memoria PGA que se asigna específicamente para cada sesión.

Esto degrada el rendimiento de la base de datos. Esto significa que nuestra consulta seguramente debe estar funcionando bien, pero al mismo tiempo, nuestra base de datos puede que no.

No podemos tener una consulta bien optimizada comprometiendo el rendimiento de toda nuestra base de datos. ¿Verdad?

¿Cómo podemos resolver este problema de agotamiento de la memoria mediante la recopilación masiva?

Este problema de agotamiento de la memoria se puede superar fácilmente si podemos controlar y restringir la cantidad de datos obtenidos mediante la recopilación masiva. Podemos hacerlo usando Bulk Collect con la cláusula LIMIT.

¿Cuál es la sintaxis de la cláusula LIMIT?

La cláusula LIMIT funciona como un atributo de una instrucción FETCH-INTO:

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

Como LIMIT funciona como un atributo de la declaración FETCH-INTO, para usarlo puede agregar la palabra clave LIMIT seguido de un dígito numérico específico que especificará el número de filas que la cláusula de recolección masiva recuperará de una sola vez al final de FETCH. declaración -INTO.

¿Qué hace la cláusula LIMIT?

La cláusula LIMIT restringe el número de filas obtenidas mediante BULK COLLECT con la instrucción FETCH.

¿Podemos usar la cláusula LIMIT con la declaración SELECT-INTO?

No, no podemos usar la cláusula LIMIT con la instrucción SELECT-INTO. La cláusula LIMIT funciona como un atributo de la declaración FETCH-INTO porque la cláusula LIMIT requiere un cursor explícito para funcionar y la declaración FETCH-INTO es parte del ciclo de vida explícito del cursor.

Así que recuerde siempre que la cláusula LIMIT solo se puede usar cuando está usando BULK COLLECT con la declaración FETCH-INTO. No se puede usar cuando se utiliza la recopilación masiva con la instrucción SELECT-INTO.

Ejemplo:cómo usar la cláusula LIMIT con la instrucción Bulk Collect en Oracle Database

Aquí hay un ejemplo muy simple que le muestra cómo puede trabajar con la cláusula 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;
/

Puede consultar el video tutorial en mi canal de YouTube para obtener una explicación detallada del código anterior.

Entonces, esta vez, en lugar de obtener todos los registros y agotar un recurso costoso como la memoria, gracias a la cláusula LIMIT, estamos recuperando solo las filas necesarias y sin desperdiciar ningún recurso. De esta forma, podemos mejorar el rendimiento de nuestras consultas con la recopilación masiva.

Ahora pregunta, Manish, ¿cuál es la cantidad correcta de filas que podemos obtener?

Para saber la respuesta a esta pregunta le sugiero que lea este blog de mi querido amigo Steven Feuerstein en el sitio web de Oracle. Ha respondido muy bien a esta pregunta.

También hay una deficiencia con este enfoque y es:si ejecuta este mismo programa nuevamente, esta declaración FETCH-INTO con la cláusula LIMIT no agregará la colección con los siguientes 10 registros. Más bien, truncará la tabla y volverá a llenar la tabla anidada desde el índice n.º 1.

Mi querido amigo Connor McDonald ha hecho un blog explicando cómo puedes superar este problema usando MULTISET. Continúe y revise su artículo.

Ese es el blog detallado de PL/SQL sobre cómo usar la cláusula LIMIT con Bulk Collect en Oracle Database. Espero que hayas disfrutado leyendo, si es así, asegúrate de compartir este tutorial con tus amigos en tus redes sociales. Gracias por leer. ¡Que tengas un gran día!