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).