Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Coleta em massa PL/SQL com cláusula LIMIT no banco de dados Oracle

Coleta em massa com cláusula LIMIT no banco de dados Oracle


Até agora, aprendemos como melhorar o desempenho da consulta usando coleta em massa com SELECT-INTO, que usa o cursor implícito e a instrução FETCH-INTO de um cursor explícito. Mas a questão permanece:ainda há espaço para uma otimização de consulta adicional? Neste blog, aprenderemos como podemos melhorar ainda mais nossa consulta usando a cláusula Limit com coleta em massa?

Já aprendemos o processo de compactar vários switches usando coleta em massa com select-into e, por sua vez, obter maior controle sobre a consulta usando o mesmo com uma instrução fetch-into de um cursor explícito. Mas ainda há um problema que requer nossa atenção e que é o esgotamento excessivo de memória causado pela coleta em massa.

O que você quer dizer com esgotamento excessivo de memória causado pela coleta em massa?


Sempre que recuperamos ou buscamos um grande número de registros usando a cláusula de coleta em massa, nosso programa começa a consumir muita memória para ser rápido e eficiente. Esta não é uma memória qualquer. Ao contrário da memória SGA que é compartilhada entre todas as sessões do Oracle Database, o programa consome a memória PGA que é alocada especificamente para cada sessão.

Isso degrada o desempenho do banco de dados. Isso significa que nossa consulta certamente deve ter um bom desempenho, mas, ao mesmo tempo, nosso banco de dados pode não estar.

Não podemos ter uma consulta bem otimizada comprometendo o desempenho de todo o nosso banco de dados. Direita?

Como podemos resolver esse problema de esgotamento de memória por coleta em massa?


Esse problema de esgotamento de memória pode ser facilmente superado se pudermos controlar e restringir a quantidade de dados obtidos usando a coleta em massa. Podemos fazer isso usando o Bulk Collect com a cláusula LIMIT.

Qual ​​é a sintaxe da cláusula LIMIT?


A cláusula LIMIT funciona como um atributo de uma instrução FETCH-INTO:
FETCH <cursor_name> BULK COLLECT INTO <plsql_collection> LIMIT number;

Como LIMIT funciona como um atributo da instrução FETCH-INTO, para usá-lo, você pode adicionar a palavra-chave LIMIT seguida por um dígito numérico específico que especificará o número de linhas que a cláusula de coleta em massa recuperará de uma só vez no final de FETCH -INTO declaração.

O que a cláusula LIMIT faz?


A cláusula LIMIT restringe o número de linhas buscadas usando BULK COLLECT com a instrução FETCH.

Podemos usar a cláusula LIMIT com a instrução SELECT-INTO?


Não, não podemos usar a cláusula LIMIT com a instrução SELECT-INTO. A cláusula LIMIT funciona como um atributo para a instrução FETCH-INTO porque a cláusula LIMIT requer um cursor explícito para funcionar e a instrução FETCH-INTO faz parte do ciclo de vida do cursor explícito.

Portanto, lembre-se sempre que a cláusula LIMIT só pode ser usada quando você estiver usando BULK COLLECT com a instrução FETCH-INTO. Ele não pode ser usado quando você estiver usando a coleta em massa com a instrução SELECT-INTO.

Exemplo:como usar a cláusula LIMIT com a instrução Bulk Collect no Oracle Database


Aqui está um exemplo muito simples mostrando como você pode trabalhar com a 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;
/

Você pode consultar o tutorial em vídeo no meu canal do YouTube para obter uma explicação detalhada do código acima.



Portanto, desta vez, em vez de buscar todos os registros e esgotar um recurso caro como memória, graças à cláusula LIMIT, estamos recuperando apenas as linhas necessárias e também sem desperdício de recursos. Dessa forma, podemos elevar nosso desempenho de consulta a um nível superior com a coleta em massa.

Então agora você pergunta, Manish, qual é a quantidade certa de linhas que podemos buscar?


Para saber a resposta a esta pergunta sugiro que leia este blog do meu querido amigo Steven Feuerstein no site da Oracle. Ele respondeu essa pergunta muito bem.

Há uma falha com essa abordagem também:se você executar esse mesmo programa novamente, essa instrução FETCH-INTO com cláusula LIMIT não anexará a coleção com os próximos 10 registros. Em vez disso, ele truncará a tabela e preencherá a tabela aninhada novamente a partir do índice no.1.

Meu querido amigo Connor McDonald fez um blog explicando como você pode superar esse problema usando o MULTISET. Vá em frente e confira seu artigo.

Esse é o blog detalhado de PL/SQL sobre como usar a cláusula LIMIT com o Bulk Collect no Oracle Database. Espero que tenha gostado da leitura, se sim, compartilhe este tutorial com seus amigos em suas redes sociais. Obrigado por ler. Tenha um ótimo dia!