Le comportement de clôture d'optimisation d'un CTE (requête WITH) est-il spécifié dans la norme SQL: 2008? Si oui, où?

23

Je vois des références fréquentes à des WITHrequêtes (expressions de table communes ou CTE) agissant comme une barrière d'optimisation, où le serveur n'est pas autorisé à pousser les filtres vers le bas dans les requêtes CTE, à extraire des expressions courantes hors du CTE, etc. être un comportement requis par les normes SQL.

Les CTE sont définitivement une barrière d'optimisation dans PostgreSQL ... mais est-ce requis par la norme, ou en fait juste des détails d'implémentation?

Par exemple, ces messages de liste de diffusion affirment ou suggèrent que c'est standard:

Après l'avoir mentionné dans un commentaire, on m'a demandé où il était spécifié - et après avoir regardé le seul projet de SQL: 2008 auquel 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: L'optimisation des clôtures des CTE dans PostgreSQL est-elle réellement requise par la norme? Et si oui, où est-il spécifié? Ou les déclarations sur la liste de diffusion Pg sont-elles erronées?

Voir aussi le thread d' optimisation CTE sur la liste des tâches? .

Craig Ringer
la source

Réponses:

10

Je pense que c'est un détail de mise en œuvre.

Une implémentation conforme n'est pas requise pour effectuer la séquence exacte d'actions définie dans les règles générales, à condition que son effet sur les données SQL et les schémas, sur les paramètres et la variable hôte, et sur les paramètres SQL et les variables SQL soit identique à l'effet de cela. séquence. Le terme est effectivement utilisé pour souligner des actions dont l'effet pourrait être obtenu par d'autres moyens par une mise en œuvre. 1

Je pense qu'un implémenteur pourrait évaluer une expression de table commune 20 fois, même de 20 manières différentes, et avoir toujours une implémentation conforme. La seule question pertinente est de savoir si "son effet ... est identique à l'effet" de la séquence d'actions définie 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, portant le nom de fichier local 5CD2-01-Framework-2006-01.pdf, p. 41 Je n'ai aucune idée d'où je l'ai obtenu. Google le sait peut-être.

Mike Sherrill 'Cat Recall'
la source
2
Cela a du sens - et puisque PostgreSQL autorise l'utilisation de fonctions avec des effets secondaires ou des instructions de modification de données dans les CTE, il doit clôturer ces CTE. Je suppose que cela signifie qu'il serait gratuit de CTE en ligne qui appellent uniquement STABLEou IMMUTABLEfonctionne.
Craig Ringer
Je pense que les CTE inscriptibles ne sont pas encore dans les normes SQL, mais je ne suis pas positif.
Mike Sherrill 'Cat Recall'
Les wCTE sont certainement une extension PostgreSQL. Il est moins clair si les fonctions qui exécutent DML le sont, car les fonctions définies par l'utilisateur dans SQL sont celles SQL/PSMque Pg ne prend pas en charge du tout ...
Craig Ringer