Von msdn :
Im Gegensatz zu einer abgeleiteten Tabelle kann ein CTE selbstreferenzierend sein und in derselben Abfrage mehrfach referenziert werden.
Ich benutze CTEs ziemlich oft, aber ich habe nie tief über die Vorteile nachgedacht, die sie mit sich bringen.
Wenn ich in derselben Abfrage mehrmals auf einen CTE verweise:
- Gibt es einen Leistungsvorteil?
- Überprüft SQL Server die Zieltabellen zweimal, wenn ich einen Self-Join durchführe?
sql-server
cte
Royi Namir
quelle
quelle
Antworten:
In der Regel wird ein CTE NIEMALS die Leistung verbessern .
Ein CTE ist im Wesentlichen eine Einwegansicht. Es sind keine zusätzlichen Statistiken, keine Indizes usw. gespeichert. Sie fungieren als Kurzform für eine Unterabfrage.
Meiner Meinung nach können sie EINFACH überbeansprucht werden (ich sehe in meinem Job viel überbeanspruchten Code). Hier finden Sie einige gute Antworten. Wenn Sie jedoch mehr als einmal auf etwas verweisen müssen oder es sich um mehr als ein paar hunderttausend Zeilen handelt, geben Sie es
#temp
stattdessen in eine Tabelle ein und indizieren Sie es.quelle
CTE
ist a eine schlechte Wahl, da die Ergebnisse nach der ersten Abfrage verworfen werden.Neben der Rekursion finde ich CTEs unglaublich nützlich, wenn komplexe Berichtsabfragen erstellt werden. Ich benutze eine Reihe von CTEs, um die benötigten Daten zu erhalten und sie dann in der endgültigen Auswahl zu kombinieren. Ich finde, dass sie einfacher zu pflegen sind, als dasselbe mit vielen abgeleiteten Tabellen oder 20 Joins zu tun, und ich kann mir sicherer sein, dass sie aufgrund der Eins-zu-Viele-Beziehungen in die richtigen Daten ohne Auswirkung mehrerer Datensätze zurückgeben all die verschiedenen Joins. Lassen Sie mich ein kurzes Beispiel geben:
Wenn Sie also die verschiedenen gewünschten Informationsblöcke herausfiltern, können Sie jedes Teil einzeln überprüfen (indem Sie die auskommentierten Auswahlen verwenden, jedes einzeln auskommentieren und nur bis zu dieser Auswahl ausführen) und wenn Sie eine Änderung an den Ausgaben vornehmen müssen Berechnung (in diesem Beispiel) ist es einfacher zu finden, als wenn sie alle zu einer massiven Abfrage zusammengemischt werden. Natürlich sind die tatsächlichen Berichtsabfragen, für die ich dies verwende, im Allgemeinen viel komplizierter als das Beispiel.
quelle
Wie immer kommt es darauf an, aber es gibt Fälle, in denen die Leistung stark verbessert wird. Ich sehe es bei INSERT INTO SELECT-Anweisungen, bei denen Sie einen CTE für die Auswahl verwenden und diesen dann in INSERT INTO verwenden. Dies hat möglicherweise mit der Aktivierung von RCSI für die Datenbank zu tun. In Zeiten, in denen nur sehr wenig ausgewählt ist, kann dies jedoch zu einer erheblichen Verbesserung führen.
quelle