Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Comment puis-je forcer une sous-requête à fonctionner aussi bien qu'une table #temp ?

Il y a quelques explications possibles pour expliquer pourquoi vous voyez ce comportement. Certains courants sont

  1. La sous-requête ou le CTE peut être réévalué à plusieurs reprises.
  2. 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.
  3. 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é.