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

Por que o planejador está apresentando resultados diferentes para funções com volatilidades diferentes?


Ele estima 1.000 linhas

1000 linhas estimadas é um valor padrão documentado em CREATE FUNCTION :

Quando uma função é declarada volátil, ela está pedindo para não ser inlineada, então este valor padrão para result_rows detém.

Por outro lado, quando está sendo inlineado em uma consulta como em seu segundo teste, o número de linhas será estimado como se o corpo da função tivesse sido movido para a consulta e a declaração da função não existisse. Isso leva no segundo teste a uma estimativa exata, pois os VALUES cláusula pode ser avaliada diretamente.

O que exatamente o planejador está fazendo aqui e onde posso ler alguma documentação sobre isso?

Em geral, as estratégias de otimização do planejador não são explicadas na documentação principal. Eles são discutidos em listas de discussão e mencionados nos comentários do código-fonte, que felizmente tendem a ser excepcionalmente claros e bem escritos (comparados ao código-fonte médio). No caso de inlining de função, acredito nos comentários de inline_set_returning_functions e inline_set_returning_function revelar a maioria das regras que orientam essa otimização específica. (aviso:os links acima estão no branch master atual que está sujeito a alterações ou desvios a qualquer momento).