Pelo que entendi, quando você envia uma consulta ao Postgres como:
SELECT id FROM table1 WHERE name = $1;
O Postgres criará um plano de consulta. O plano será armazenado em cache para a mesma consulta na mesma sessão. Mas se você criar uma função:
CREATE OR REPLACE FUNCTION get_table1 (parname text) RETURNS bigint
LANGUAGE plpgsql AS
$$BEGIN
RETURN (SELECT id FROM table1 where name = parname);
END$$;
O plano de consulta será armazenado em cache para todas as sessões futuras.
Gostaria de verificar essa teoria verificando com que frequência o analisador de consultas é invocado. Existe uma maneira de inspecionar o número de vezes que o Postgres analisa uma consulta?
Se possível, gostaria de monitorar coisas como #parses por segundo e a duração mínima/máxima/média da análise.
Não é possível salvar planos de consulta "para todas as sessões futuras". Os planos de consulta são salvos apenas para a sessão atual. E reutilizado apenas sob várias condições favoráveis.
Os planos para consultas SQL ad hoc não são salvos . Todas as consultas dentro das funções PL/pgSQL são tratadas como instruções preparadas . E há mais etapas do que apenas o planejamento da consulta.
É importante observar que houve mudanças substanciais desde o Postgres 9.1 , onde os planos genéricos foram salvos de forma mais geral e reutilizados para instruções dentro do PL/pgSQL. Isso se tornou muito mais inteligente com a página 9.2.
O manual (ênfase em negrito meu):
Isso não diz nada sobre planos de consulta ainda:
E mais abaixo:
Como saber se um plano genérico é usado?
Um plano salvo é sempre um plano genérico, mas não o contrário.
Onde as declarações preparadas são salvas?
Planos de consulta para instruções SQL em PL/pgSQL
Esses não são normalmente visíveis na
EXPLAIN
saída. Você também pode instalar o módulo adicional de autoexplicação para gravar esses planos no log. Detalhes aqui:Para obter detalhes sobre como planejar o cache nas funções PL/pgSQL, leia o manual diretamente.