• Anderson Graf

Função Deterministica (FUNCTION DETERMINISTIC)

As funções deterministicas existentes desde a versão 8i são conhecidas por muitos DBA’s e desenvolvedores apenas como necessárias para a criação de índices baseados em função (Function based index – FBI). Certamente que elas são necessárias para as FBI, mas o que elas realmente fazem? ou melhor, proporcionam? 


Quando criamos uma function (create function) podemos especificar ou omitir a palavra DETERMINISTC. Quando especificada permite que a execução da SQL salve uma copia do resultado de retorno da função para poder prover maior performance nas chamadas subsequentes com o mesmo valor de entrada na mesma SQL sem a necessidade de reexecutar a função. O otimizador escolhe a melhor performance entre obter a copia dos resultados salva ou chamar novamente a função. 


Vamos demonstrar como isto funciona e seu impacto positivo na performance.


Observe que a FUNCTION foi criada sem a expressão DETERMINISTIC. Abaixo vamos criar e popular uma tabela EXEMPLO.


Vamos habilitar um trace da sessão e executar a seguinte query:


Agora gerando um TKPROF e verificando o arquivo gerado (exemplo.txt)


Observe que tivemos uma execução (Execute) da query levando 8.23 segundos (elapsed). 


Mais abaixo temos a chamada que esta query fez sobre a função f_exemplo. Tivemos 200000 execuções (Execute) resultando em 2.64 segundos totais. 


Mas porque foram 200.000 execuções e não 100.000? Simples, porque fazemos doas chamadas da função na mesma query, deste modo temos o dobro de execuções baseado na quantidade de registros verificados. 


Agora vamos criar a mesma função (F_EXEMPLO) porem especificando a function como sendo DETERMINISTIC.


Habilitamos novamente um trace da sessão e executamos a mesma query.


Gerando um tkprof veja agora como ficou.


Menos de um segundo foi necessário para executar toda a query. 


E quantas chamadas da função F_EXEMPLO foi feita? Apenas duas em 0.00 segundos! Uma do select outra da condição (literais), isto porque ele recuperou o retorno salvo para as mesmas entradas do SQL, no caso o VALOR.


COMPARATIVO:



Como comentado, as funções DETERMINISTICAS também são necessárias para criar as FBI, observem:

Agora se removermos a expressão DETERMINISTC da função vamos receber o erro ORA-30533

Vale lembrar que se for alterado a semântica da função você terá que recriar manualmente os índices baseados em função (FBI) e materialized views. 


86 visualizações

© 2018 Exímio Solução em TI

  • Grey Facebook Ícone
  • Ícone cinza LinkedIn