Métodos de compilação PLSQL

Muitas vezes no seu dia a dia você tem objetos PLSQL que precisam ser executados com uma certa frequência e necessitam de uma velocidade bem agressiva. Nestes casos o primeiro passo é fazer um trabalho de otimização no código e também na instancia (caso seja preciso), mas se mesmo assim você ainda não conseguir chegar a um tempo de resposta adequado, ainda há uma solução. O método de compilação de seu código, interpretado ou nativo, vejamos na sequencia esse assunto com maiores detalhes.

Na versão 9i do Oracle, foi introduzida capacidade de compilar seus códigos PLSQL de maneira “nativa” (diretamente na linguagem C) o que o torna bem mais rápido do que no modo interpretado. Nessa época, e desenvolvedor tinha uma certa dependência do DBA, pois era preciso que fosse definido no SPFILE da instancia de banco de dados um parâmetro chamado “PLSQL_NATIVE_LIBRARY_DIR”, onde se apontava um diretório para instalar um compilador da linguagem C. Pois bem, isso já faz parte do passado e nas versões mais atuais (11g / 12c) não há mais essa necessidade, tudo o que se precisa fazer é alterar um outro parâmetro de nome PLSQL_CODE_TYPE, que pode ser alterado diretamente no escopo de sessão e então tirar todo proveito dessa alternativa para acelerar o tempo de execução de seus objetos PLSQL, vejamos o exemplo abaixo:

PLSQL_CODE_TYPE = ‘INTERPRETED’: Neste modo, o código é compilado em uma área intermediaria da memória e persistido no dicionário de dados da instancia, para ser interpretado em tempo de execução (o que é mais demorado).

PLSQL_CODE_TYPE = ‘NATIVE’: Neste caso o código não será interpretado em tempo de execução, pois o mesmo já será persistido em sua forma nativa, consequentemente a execução será mais rápida.

Você pode alterar o valor do parâmetro PLSQL_CODE_TYPE no escopo de sessão:

ALTER SESSION SET PLSQL_CODE_TYPE = NATIVE;

Ou no momento da compilação do seu objeto PLSQL:

ALTER PROCEDURE my_proc COMPILE PLSQL_CODE_TYPE = NATIVE;

Você pode consultar o método de compilação de seus objetos PLSQL através das views de performance USER | ALL | DBA_PLSQL_OBJECT_SETTINGS. Agora vamos à parte prática deste assunto.

SQL> connect hr/hr
Connected.
SQL> create or replace function fib (n POSITIVE) return integer is
2 begin
3 if (n = 1) or (n = 2) then
4 return 1;
5 else
6 return fib(n - 1) + fib(n - 2);
7 end if;
8 end fib;
9 /
Function created.
SQL> ALTER SESSION SET plsql_code_type = 'INTERPRETED';
Session altered.
SQL> ALTER FUNCTION fib COMPILE;
Function altered.
SQL> DECLARE
2 X number;
3 begin
4 X := fib(40);
5 dbms_output.put_line(X);
6 end;
7 /
102334155
PL/SQL procedure successfully completed.
Elapsed: 00:01:05.34
SQL> CONNECT / AS SYSDBA
Connected.
SQL> ALTER SYSTEM flush shared_pool;
System altered.
SQL> CONNECT hr/hr
Connected.
SQL> ALTER SESSION SET plsql_code_type = 'NATIVE';
Session altered.
SQL> ALTER FUNCTION fib COMPILE;
Function altered.
SQL> set serveroutput on
SQL> set timing on
SQL> DECLARE
2 X number;
3 BEGIN
4 X := fib(40);
5 dbms_output.put_line(X);
6 END;
7 /
102334155
PL/SQL procedure successfully completed.
Elapsed: 00:00:32.63
SQL>

Está aí o exemplo, agora pegue aquele seu processo que leva cerca de duas horas para executar e corte esse tempo pela metade! rsrsrs. Espero ter ajudado.

Forte abraço e até a próxima!

Douglas Paiva de Sousa

Deixe um comentário