web-dev-qa-db-fra.com

Quelles règles déterminent lorsque SQL Server utilise un CTE comme "clôture d'optimisation"?

Un moment de retour, Brent Ozar a publié un poste détaillant certaines des différences entre le serveur SQL et PostgreSQL:

deux différences importantes entre SQL Server et PostgreSQL

Le premier point ("CTES sont des clôtures d'optimisation") a attrapé mon œil, car il est évident que, dans l'exemple fourni, SQL Server combine le CTE et la requête principale ensemble et l'optimise comme une seule requête (par opposition au comportement opposé dans PostgreSQL).

Cependant, ce comportement semble contraire aux exemples que j'ai constatés dans d'autres blogs et classes de formation, où SQL Server traite la CTE comme une clôture d'optimisation, ce qui permet une meilleure utilisation d'index, de meilleures performances, etc. Par exemple:

ne meilleure façon de sélectionner Star

Donc, il semble que SQL Server "honore" le CTE comme une clôture d'optimisation parfois. Existe-t-il des bonnes ressources disponibles qui documentent la liste spécifique des cas connus dans lesquels SQL Server respectera de manière fiable la CTE comme une clôture d'optimisation (ou le comportement opposé)?

10
Bryan Rebok

... Liste des cas connus où SQL Server honorera de manière fiable la CTE comme une clôture d'optimisation

Toute liste de ce type compterait sur le comportement observé, sans aucune garantie de fiabilité.

L'optimiseur de requêtes SQL Server traite jamais une expression de table commune comme une clôture d'optimisation en soi, bien que certaines constructions soient clairement difficiles à optimiser à travers. Les CTES récursives en sont un bon exemple de cela.

Les CTES sont traitées de manière très similaire aux vues/fonctions en ligne/sous-requêtes/tables dérivées et inline dans la requête. Tout comportement de "clôture" observé dépend de l'optimiseur de ne pas pouvoir ou décider de ne pas être optimiser à travers cette frontière perméable en principe.

De manière générale, le CTE plus simple et plus "relationnel" est, plus il est probable que l'optimiseur puisse bouger des bits.

Caractéristiques qui permettraient à l'optimiseur de considérer ou de la forcer à matérialiser le "résultat" d'une CTE ont été suggérées, mais pas encore mis en œuvre:

Entre-temps, la solution de contournement la plus courante consiste à concrétiser explicitement le résultat intermédiaire défini dans une table temporaire ou une variable de table. Cela nécessite évidemment un scénario non limité à une seule déclaration.

10
Paul White 9