Es gibt einige mögliche Erklärungen dafür, warum Sie dieses Verhalten sehen. Einige gebräuchliche sind
- Die Unterabfrage oder der CTE wird möglicherweise wiederholt neu ausgewertet.
- Teilergebnisse in einen
#temp
materialisieren Tabelle kann eine optimalere Join-Reihenfolge für diesen Teil des Plans erzwingen, indem einige mögliche Optionen aus der Gleichung entfernt werden. - Teilergebnisse in einen
#temp
materialisieren kann den Rest des Plans verbessern, indem schlechte Kardinalitätsschätzungen korrigiert werden.
Die zuverlässigste Methode ist einfach die Verwendung eines #temp
Tabelle und materialisieren Sie es selbst.
Andernfalls zu Punkt 1 siehe Geben Sie einen Hinweis, um die Zwischenmaterialisierung von CTEs oder abgeleiteten Tabellen zu erzwingen
. Die Verwendung von TOP(large_number) ... ORDER BY
kann oft dazu führen, dass das Ergebnis gespoolt wird, anstatt wiederholt neu bewertet zu werden.
Auch wenn das funktioniert, gibt es keine Statistik auf der Spule.
Für die Punkte 2 und 3 müssten Sie analysieren, warum Sie nicht den gewünschten Plan erhalten. Möglicherweise erhalten Sie einen besseren Plan, indem Sie die Abfrage so umschreiben, dass sie Sargable-Prädikate verwendet, oder Statistiken aktualisieren. Andernfalls können Sie versuchen, Abfragehinweise zu verwenden, um den gewünschten Plan zu erhalten.