sexta-feira, 5 de setembro de 2014

Commit a cada bloco de Delete - Otimizado [Oracle];

Pessoal,

Neste Post http://dbaduarte.blogspot.com.br/2014/05/commit-cada-bloco-de-delete.html demonstrei como efetuar um DELETE em massa com COMMIT, porém há outra forma muito mais rápida, sendo eficiente para tabelas com milhares de registros.

O Desempenho da codificação do FORALL é extremamente mais veloz que um LOOP, pois a declaração é executada apenas uma vez para cada entrada da coleção.

No exemplo, a cada 1 Milhão de DELETES será feito um commit:

DECLARE
       c_limit PLS_INTEGER := 1000000;

       TYPE urowid_table  IS TABLE OF UROWID  INDEX BY BINARY_INTEGER;
       rowids urowid_table;
 
   CURSOR CUR IS 
       Select rowid from TABELA
       where ID > 20;
   
BEGIN
   OPEN CUR;
   
     LOOP

       FETCH CUR
       BULK COLLECT INTO ROWIDS
       LIMIT c_limit;

         FORALL i in 1..ROWIDS.count
      
         delete from TABELA
         where ROWID = ROWIDS(i);
      
         EXIT WHEN ROWIDS.COUNT = 0;
         DBMS_OUTPUT.PUT_LINE(TO_CHAR(SQL%ROWCOUNT) || ' Linhas Deletadas');
         COMMIT;  

     END LOOP;
   CLOSE CUR;
END;

Valeu,
Bruno Duarte.

2 comentários:

  1. Parabéns pelo Blog, conteúdo muito interessante e resoluções muito práticas.

    ResponderExcluir
    Respostas
    1. Giorgio muito obrigado pelo Feedback.
      Tento fazer os meus posts de uma maneira bem fácil e explicativa.

      Não estou conseguindo atualizar o blog, porque o local que trabalho atualmente o blogger é bloqueado, porém vou pegar um dia para fazer novas publicações - estou com muitas coisas legais.

      Valeu,
      Bruno Duarte.

      Excluir