Estou usando uma função PL / pgSQL no PostgreSQL 9.3 com várias consultas complexas dentro:
create function f1()
returns integer as
$$
declare
event tablename%ROWTYPE;
....
....
begin
FOR event IN
SELECT * FROM tablename WHERE condition
LOOP
EXECUTE 'SELECT f2(event.columnname)' INTO dummy_return;
END LOOP;
...
INSERT INTO ... FROM a LEFT JOIN b ... LEFT JOIN c WHERE ...
UPDATE T SET cl1 = M.cl1 FROM M WHERE M.pkcols = T.pkcols;
...
end
$$ language plpgsql;
Se eu corria EXPLAIN ANALYZE f1()
, só recebia o tempo total, mas não havia detalhes. Existe uma maneira de obter resultados detalhados para todas as consultas na função?
Se as consultas na função não deveriam ser otimizadas pelo Postgres, também pediria uma explicação.
auto_explain.log_nested_statements
pode ajudar. Veja postgresql.org/docs/9.3/static/auto-explain.htmlRespostas:
Primeiro, a sintaxe correta para a
EXPLAIN
chamada precisa de aSELECT
. Você não pode simplesmente escrever o nome da função vazia no SQL:Otimização
As funções PL / pgSQL são caixas pretas para o planejador de consultas. As consultas internas são otimizadas como outras consultas, mas separadamente e uma a uma como instruções preparadas, e o plano de execução pode ser armazenado em cache durante a sessão. Detalhes:
EXPLAIN
corpos funcionaisComo o @Daniel já comentou, você pode usar o módulo adicional auto_explain para obter mais detalhes ( muitos detalhes). Instruções dentro das funções plpgsql são consideradas "instruções aninhadas". Certifique-se de definir
Instruções detalhadas:
Como uma exceção à regra, funções SQL muito simples (não plpgsql) podem ser "embutidas", ou seja, o código da função é inserido na consulta externa e tudo é executado como se não houvesse uma função para começar. O plano de consulta inclui informações detalhadas nesses casos.
fonte