PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Pourquoi le planificateur arrive-t-il à des résultats différents pour des fonctions avec des volatilités différentes ?

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