Pular para o conteúdo

Paralelismo em PL/SQL no Oracle 19c: Uma Visão Detalhada

Paralelismo em PL/SQL no Oracle 19c: Uma Visão Detalhada

O paralelismo é uma técnica poderosa que permite a divisão de tarefas em sub-tarefas que podem ser processadas simultaneamente, maximizando a utilização dos recursos e acelerando as operações.

Criando e Populando big_table

Vamos começar criando uma tabela chamada big_table e populando-a com dados de exemplo.

CREATE TABLE big_table (
   ID NUMBER PRIMARY KEY,
   DATA VARCHAR2(255)
);

-- Populando big_table com dados de exemplo
BEGIN
   FOR i IN 1..10000 LOOP
      INSERT INTO big_table (ID, DATA) VALUES (i, 'Data' || i);
   END LOOP;
   COMMIT;
END;
/

Neste exemplo, temos 10.000 registros em big_table que desejamos atualizar usando paralelismo.

Paralelismo em Detalhe

Quando falamos de paralelismo em Oracle, geralmente nos referimos a dividir uma tarefa específica em várias sub-tarefas menores e processá-las em paralelo. O Oracle consegue isso usando Processadores Paralelos de Consulta (PQPs).

Usando Paralelismo em PL/SQL

Oracle 19c introduz muitas melhorias para PL/SQL e fornece ferramentas para paralelizar tarefas PL/SQL, especificamente o pacote DBMS_PARALLEL_EXECUTE.

Exemplo Prático

Vamos dividir a atualização de big_table em 10 partes e processar em paralelo.

DECLARE
   l_sql_stmt     VARCHAR2(500);
   l_task_name    VARCHAR2(100);
   l_plsql_block  VARCHAR2(500);
   l_start_id     NUMBER;
   l_end_id       NUMBER;
BEGIN
   l_sql_stmt := 'UPDATE big_table SET DATA = DATA || '' Updated'' WHERE ID BETWEEN :start_id AND :end_id';

   FOR i IN 1..10 LOOP
      l_task_name := 'Update_Task_' || i;
      l_start_id := (i-1) * 1000 + 1;
      l_end_id := i * 1000;

      l_plsql_block := 'BEGIN UPDATE big_table SET DATA = DATA || '' Updated'' WHERE ID BETWEEN ' || l_start_id || ' AND ' || l_end_id || '; END;';

      -- Definindo tarefa
      DBMS_PARALLEL_EXECUTE.CREATE_TASK (
         task_name        => l_task_name,
         sql_stmt         => NULL,
         plsql_block      => l_plsql_block,
         language_flag    => DBMS_SQL.NATIVE
      );

      -- Iniciando tarefa
      DBMS_PARALLEL_EXECUTE.CREATE_RUN_TASK(l_task_name, TRUE);
   END LOOP;
END;
/

Após a execução deste script, os dados em big_table terão a string ‘Updated’ anexada aos valores existentes em colunas de dados para todos os registros.

Conclusão

Paralelismo, quando utilizado adequadamente, pode oferecer melhorias significativas de desempenho. No entanto, é vital garantir que as tarefas paralelas não causem bloqueios ou competição excessiva pelos recursos. Recomenda-se testar extensivamente em um ambiente não produtivo antes de implementar soluções paralelas em produção.

Abs

Referências

Giovano Silva

Giovano Silva

Giovano Silva é um profissional com mais de 10 anos de experiência em tecnologias Oracle, com ênfase em PL/SQL. Ele adora escrever sobre soluções para problemas comuns enfrentados por profissionais Oracle em seu dia a dia. Seu objetivo é compartilhar conhecimento, simplificar conceitos complexos e ajudar a comunidade Oracle a crescer coletivamente.

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

plugins premium WordPress