Je vois des références fréquentes à WITH
requêtes (expressions de table communes ou ctes) agissant comme une clôture d'optimisation, où le serveur n'est pas autorisé à appuyer sur les filtres dans les requêtes CTE, tirez des expressions communes à l'extérieur du CTE , etc. Il est souvent prétendu être un comportement requis par les normes SQL.
Les CTES sont définitivement une clôture d'optimisation dans PostgreSQL ... mais est-ce requis par la norme ou réellement des détails de mise en œuvre?
Par exemple, la présente liste de diffusion publie ou suggère qu'il est standard:
Après avoir mentionné - dans un commentaire On m'a demandé où il est spécifié - et après un regard sur le seul brouillon de SQL: 2008, j'ai accès à je n'ai pas beaucoup de chance de le trouver.
Je n'ai pas encore étudié de manière intensive la norme. J'espère donc une suggestion de quelqu'un qui a: est l'escrime d'optimisation des CTES dans PostgreSQL réellement requis par la norme? Et si oui, où est-il spécifié? Ou sont les déclarations sur la liste de diffusion PG en erreur?
Voir aussi le fil clôture de l'optimisation CTE sur la liste TODO? .
Je pense que c'est un détail de mise en œuvre.
Une implémentation conforme n'est pas nécessaire pour effectuer la séquence exacte des actions définies dans les règles générales, à condition que son effet sur SQL-Data and Schemas, sur les paramètres d'hôte et la variable hôte, ainsi que sur les paramètres SQL et les variables SQL sont identiques à l'effet de cette séquence. Le terme efficacement est utilisé pour souligner les actions dont l'effet pourrait être atteint d'une autre manière par une mise en œuvre.1
Je pense qu'un agent de mise en œuvre pourrait évaluer une expression de table commune 20 fois, même de 20 manières différentes, et toujours avoir une implémentation conforme. Le seul problème pertinent est de savoir si "son effet".. Est identique à l'effet "de la séquence d'actions définies dans les règles générales.
[1]. Section 6.3.3.3, "Ordre d'évaluation des règles", dans un projet de norme SQL 2008, ayant le nom de fichier local 5CD2-01-Framework-2006-01.PDF, p. 41 J'ai Non idée où je l'ai eu. Google pourrait savoir.