Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Wie kann ich erzwingen, dass eine Unterabfrage genauso gut funktioniert wie eine #temp-Tabelle?

Es gibt einige mögliche Erklärungen dafür, warum Sie dieses Verhalten sehen. Einige gebräuchliche sind

  1. Die Unterabfrage oder der CTE wird möglicherweise wiederholt neu ausgewertet.
  2. 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.
  3. 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.