PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Por que o PostgreSQL trata minha consulta de forma diferente em uma função?

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: