Aus diesem Beitrag Wie verwende ich ROW_NUMBER im folgenden Verfahren?
Es gibt zwei Versionen von Antworten, bei denen eine a sub-query
und die andere a verwendet CTE
, um dasselbe Problem zu lösen.
Was ist nun der Vorteil der Verwendung einer CTE (Common Table Expression)
"Unterabfrage" (also besser lesbar, was die Abfrage tatsächlich tut) ?
Der einzige Vorteil der Verwendung eines CTE
über sub-select
ist , dass ich wirklich kann nenne das sub-query
. Gibt es andere Unterschiede zwischen diesen beiden, wenn ein CTE als einfacher (nicht rekursiver) CTE verwendet wird?
sql
sql-server
tsql
subquery
common-table-expression
dance2die
quelle
quelle
Antworten:
In der Unterabfrage gegenüber einfachen (nicht rekursiven) CTE-Versionen sind sie wahrscheinlich sehr ähnlich. Sie müssten den Profiler und den tatsächlichen Ausführungsplan verwenden, um Unterschiede zu erkennen. Dies ist spezifisch für Ihr Setup (daher können wir Ihnen die Antwort nicht vollständig mitteilen).
Im Allgemeinen ; Ein CTE kann rekursiv verwendet werden. Eine Unterabfrage kann nicht. Dadurch eignen sie sich besonders gut für Baumstrukturen.
quelle
A CTE can be used recursively; a sub-query cannot
. Ein Beispiel wäre toll gewesen.Der Hauptvorteil des allgemeinen Tabellenausdrucks (wenn er nicht für rekursive Abfragen verwendet wird ) ist die Kapselung. Anstatt die Unterabfrage an jedem Ort deklarieren zu müssen, an dem Sie sie verwenden möchten, können Sie sie einmal definieren, haben jedoch mehrere Referenzen dazu.
Dies bedeutet jedoch nicht , dass es nur einmal ausgeführt wird (gemäß den vorherigen Iterationen dieser Antwort vielen Dank an alle, die dies kommentiert haben). Die Abfrage kann definitiv mehrfach ausgeführt werden, wenn mehrmals darauf verwiesen wird. Der Abfrageoptimierer trifft letztendlich die Entscheidung, wie der CTE interpretiert werden soll.
quelle
CTE
sind am nützlichsten für die Rekursion:gibt
@n
Zeilen zurück (bis zu101
). Nützlich für Kalender, Dummy-Rowsets usw.Sie sind auch besser lesbar (meiner Meinung nach).
Ansonsten sind
CTE
undsubqueries
identisch.quelle
;WITH blabla AS ...)
WITH
,MERGE
und ähnlicheEin Unterschied, der nicht erwähnt wurde, ist, dass ein einzelner CTE in den verschiedenen Teilen einer Gewerkschaft referenziert werden kann
quelle
Sofern mir nichts fehlt, können Sie CTEs und Unterabfragen genauso einfach benennen.
Ich denke, der Hauptunterschied ist die Lesbarkeit (ich finde den CTE besser lesbar, weil er Ihre Unterabfrage eher im Voraus als in der Mitte definiert).
Und wenn Sie etwas mit Rekursion tun müssen, werden Sie ein bisschen Probleme haben, dies mit einer Unterabfrage zu tun;)
quelle
Eine wichtige Tatsache, die niemand erwähnt hat, ist, dass CTEs (zumindest in Postgres) Optimierungszäune sind:
https://blog.2ndquadrant.com/postgresql-ctes-are-optimization-fences/
Das heißt, sie werden als ihre eigene atomare Abfrage behandelt und nicht in den gesamten Abfrageplan gefaltet. Mir fehlt das Fachwissen, um eine bessere Erklärung zu geben, aber Sie sollten die Semantik für die von Ihnen verwendete SQL-Version überprüfen. Für fortgeschrittene Benutzer kann die Möglichkeit, einen Optimierungszaun zu erstellen, die Leistung verbessern, wenn Sie Experten in der Steuerung des Abfrageplaners sind. In 99% der Fälle sollten Sie jedoch vermeiden, dem Abfrageplaner mitzuteilen, was zu tun ist, da das, was Sie für schneller halten, wahrscheinlich schlechter ist als das, was er für schneller hält. :-)
quelle
Wenn Sie zu den Antworten anderer hinzufügen und ein und dieselbe Unterabfrage mehrmals verwendet haben, können Sie alle diese Unterabfragen durch einen CTE ersetzen. Auf diese Weise können Sie Ihren Code besser wiederverwenden.
quelle
Eine Sache, die Sie auch verstehen müssen, ist, dass in älteren Versionen von SQL Server (ja, viele Leute müssen noch SQL Server 2000-Datenbanken unterstützen) CTEs nicht zulässig sind und die abgeleitete Tabelle dann Ihre beste Lösung ist.
quelle
TIPP: (MAXRECURSION n)
Zum Beispiel könnten Sie versuchen:
quelle