Il estime 1 000 lignes
1000
lignes estimées est une valeur par défaut documentée dans CREATE FUNCTION
:
Lorsqu'une fonction est déclarée volatile, elle demande de ne pas être en ligne, donc cette valeur par défaut pour result_rows
tient.
D'autre part, lorsqu'il est intégré dans une requête comme dans votre deuxième test, le nombre de lignes va être estimé comme si le corps de la fonction avait été déplacé dans la requête et que la déclaration de fonction n'existait pas. Cela conduit dans le second test à une estimation exacte puisque les VALUES
clause peut être directement évaluée.
Que fait exactement le planificateur ici, et où puis-je lire de la documentation à ce sujet ?
En général, les stratégies d'optimisation du planificateur ne sont pas expliquées dans la documentation principale. Ils sont discutés dans les listes de diffusion et mentionnés dans les commentaires du code source, qui ont heureusement tendance à être exceptionnellement clairs et bien écrits (par rapport au code source moyen). Dans le cas de l'inlining de fonctions, je crois les commentaires de inline_set_returning_functions et inline_set_returning_function révèlent la plupart des règles régissant cette optimisation particulière. (avertissement :les liens ci-dessus renvoient à la branche principale actuelle qui est susceptible de changer ou de dériver à tout moment).