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
- Oracle Database PL/SQL Language Reference 19c.
- Oracle Database Development Guide 19c.
- Oracle Base, “DBMS_PARALLEL_EXECUTE” by Tim Hall.