J'ai une requête complexe que je dois utiliser dans une requête ultérieure (en fait une instruction de mise à jour). J'ai essayé les deux en utilisant un CTE et une table temporaire. La performance en utilisant le CTE est horrible par rapport à l'approche de la table temporaire. C'est quelque chose comme 15 secondes vs millisecondes. Pour simplifier le test au lieu de rejoindre la table CTE/Temp dans la requête suivante, je l'ai simplement sélectionné *. Dans ce cas, ils effectuent la même chose. J'ai regardé le plan d'exécution pour les deux approches à la fois avec les jointures dans la requête suivante, puis sélectionnez simplement *. Avec la sélection simple, les plans de requête sont à peu près les mêmes, mais avec les jointures dans la sélection suivante, les plans de requête ne le sont pas. Plus précisément, la partie du plan de requête pour créer et remplir la table temporaire reste la même, tandis que la partie du plan de requête pour créer et remplir le CTE change radicalement lorsqu'elle est ensuite utilisée dans une requête avec une jointure.SQL 2005 CTE par rapport à la table TEMP Performances lors de l'utilisation dans les jointures d'autres tables
Ma question est pourquoi le plan de requête pour la création et la population du CTE change par la façon dont il est ensuite utilisé alors que la table temporaire ne l'est pas. Aussi dans quels scénarios alors un CTE donnerait de meilleures performances qu'une table temporaire?
* Remarque J'ai également utilisé une variable de table et elle est comparable à l'approche de la table temporaire.
Merci
Oui pour matérialiser! Un PK/IX dans la définition pourrait être gentil. – crokusek