Atualização no PostgreSQL 9.2
Houve uma grande melhoria, cito as notas de versão aqui :
Resposta original para PostgreSQL 9.1 ou anterior
Uma função plpgsql tem um efeito semelhante ao
PREPARE
instrução:as consultas são analisadas e o plano de consulta é armazenado em cache. A vantagem é que alguma sobrecarga é salva para cada chamada.
A desvantagem é que o plano de consulta não é otimizado para os valores de parâmetro específicos com os quais é chamado.
Para consultas em tabelas com distribuição de dados uniforme, isso geralmente não será problema e as funções PL/pgSQL serão executadas um pouco mais rápido do que consultas SQL brutas ou funções SQL. Mas se sua consulta puder usar determinados índices, dependendo dos valores reais no
WHERE
cláusula ou, mais geralmente, escolher um plano de consulta melhor para os valores específicos, você pode acabar com um plano de consulta abaixo do ideal. Experimente uma função SQL ou use SQL dinâmico com EXECUTE
para forçar a replanejamento da consulta para cada chamada. Poderia ficar assim:CREATE OR REPLACE FUNCTION pie(id_param integer)
RETURNS SETOF record AS
$BODY$
BEGIN
RETURN QUERY EXECUTE
'SELECT *
FROM table_name
where id = $1'
USING id_param;
END
$BODY$
LANGUAGE plpgsql STABLE;
Editar após o comentário:
Se esta variante não alterar o tempo de execução, deve haver outros fatores em jogo que você pode ter perdido ou não mencionado. Banco de dados diferente? Valores de parâmetros diferentes? Teria que postar mais detalhes.
Eu adiciono uma citação do manual para fazer backup de minhas declarações acima: