Sou novo na tecnologia Oracle (principalmente versado em SQL Server) e estou tendo problemas com o desempenho de uma UDF.
O objetivo da UDF é obter algumas entradas para um "evento" e procurar um "tempo esperado para a ocorrência do evento b". A função retorna um único DATE
valor.
A primeira coisa que ocorre é SELECT ... INTO [variable] FROM DUAL;
uma variável. Por fim, ocorre uma pesquisa em uma tabela de referência (apenas ~ 30k linhas) e é armazenada na variável de retorno.
Demorou 8 horas para processar em 800 mil linhas. Posso selecionar todas as colunas sem usar a função em menos de 40 segundos.
Minha principal dúvida é: O uso do DUAL está me custando caro?
Estamos em um Oracle 11g RAC.
Não. O Oracle sabe que DUAL é uma tabela "in-memory". Seu problema está em outro lugar.
BTW: você também pode usar
call fname(...);
instrução.Como disse o Ivan, seu problema não é com dual especificamente. No entanto, a troca de contexto necessária para alternar entre PL/SQL e SQL está deixando as coisas mais lentas. Freqüentemente, instruções SELECT como essa podem ser convertidas em atribuições PL/SQL simples. Se isso não for possível, talvez a lógica possa ser movida para a pesquisa posterior.
Outra coisa que você pode considerar é fazer uma junção com sua tabela de referência fora da UDF.
Antes de fazer qualquer coisa, porém, você deve considerar o perfil da função com DBMS_PROFILER . Isso mostrará a você em qual parte da função focar para seu ajuste.