Il y a quelques explications possibles pour expliquer pourquoi vous voyez ce comportement. Certains courants sont
- La sous-requête ou le CTE peut être réévalué à plusieurs reprises.
- Matérialisation des résultats partiels dans un
#temp
table peut forcer un ordre de jointure plus optimal pour cette partie du plan en supprimant certaines options possibles de l'équation. - Matérialisation des résultats partiels dans un
#temp
table peut améliorer le reste du plan en corrigeant les mauvaises estimations de cardinalité.
La méthode la plus fiable consiste simplement à utiliser un #temp
table et matérialisez-la vous-même.
A défaut concernant le point 1 voir Fournir un indice pour forcer la matérialisation intermédiaire des CTE ou des tables dérivées
. L'utilisation de TOP(large_number) ... ORDER BY
peut souvent encourager le résultat à être mis en file d'attente plutôt que réévalué à plusieurs reprises.
Même si cela fonctionne, il n'y a pas de statistiques sur la bobine.
Pour les points 2 et 3, vous auriez besoin d'analyser pourquoi vous n'obteniez pas le plan souhaité. Réécrire éventuellement la requête pour utiliser des prédicats sargables ou mettre à jour les statistiques pourrait obtenir un meilleur plan. À défaut, vous pouvez essayer d'utiliser des indicateurs de requête pour obtenir le plan souhaité.