Um CTE oder nicht CTE
-
26-09-2019 - |
Frage
Nachdem viel zu lange mit SQL2000 stecken gewesen, ich habe nicht wirklich viel Exposition gegenüber Common Table Expressions.
Die Antworten, die ich gegeben habe (# 4025380) und hier (# 4018793) haben gegen die Strömung in gegangen, dass sie nicht einen CTE verwendet haben.
Ich schätze, dass für Rekursion sie sind die beez Kneez, und es gibt ein paar Abfragen, die stark durch ihre Verwendung vereinfacht werden kann, aber an welchem ??Punkt ist die Verwendung nur frivol? Haben sie einen großen Leistungsvorteil über eine Unterabfrage oder eine Verknüpfung? Haben sie wirklich simplify Code und machen es besser verwaltbar?
Kurz gesagt, wenn es gute Praxis, einen CTE über eine ‚kleinere‘ Syntax zu verwenden.
Lösung
Sie sollten in der Regel einen CTE über eine normale Unterabfrage verwenden, wenn:
- Ihre Abfrage erfordert Rekursion (wie Sie angegeben)
- Die Unterabfrage ist große oder komplexe
- Die Abfrage enthält, ist große oder komplexe
- Die Unterabfrage wird wiederholt (oder zumindest mehrere Unterabfragen durch Ausführen verschiedene einfache Operationen auf einer gemeinsame Unterabfrage vereinfacht werden)
Kurz gesagt, ja sie machen Abfragen besser lesbar, wenn gut genutzt.
Andere Tipps
Persönlich, wenn ich bequem bekam sie mit, ich glaube, dass sie produzieren sauberer, besser lesbaren Code. Als Beispiel vergleichen Sie Ihre Antwort auf meinen auf # 4018793 . Wir haben im Wesentlichen die gleiche Sache; Ich benutzte einen CTE und Sie nicht.
Ihre Antwort ohne CTE:
SELECT
course,
section,
grade,
gradeCount
FROM
table
INNER JOIN
(SELECT
grade,
Max(gradeCount) as MaxGradeCount
FROM
table
) MaxGrades
ON table.grade = MaxGrades.grade
AND table.gradeCount = MaxGrades.MaxGradeCount
ORDER BY
table.grade
Meine Antwort mit CTE:
;with cteMaxGradeCount as (
select
grade,
max(gradeCount) as MaxGradeCount
from @Test
group by grade
)
select
t.course,
t.SECTION,
t.grade,
t.gradeCount
from cteMaxGradeCount c
inner join @Test t
on c.grade = t.grade
and c.MaxGradeCount = t.gradeCount
order by t.grade
Sie sind syntaktischer Zucker, mit Ausnahme von hierarchischen / rekursive Abfragen.
Doch nicht alles, was rekursiv sein kann getan werden sollte - Datum Generation über rekursive CTE war kaum besser als ein Cursor -. Die Zahlen Tabelle Trick skaliert wesentlich besser
CTE führt zu einem schnelleren Ergebnis in einem rekursiven Szenario. Das Ergebnis der CTE wird wiederholt, um die endgültige resultset gewöhnungsbedürftig. So, da haben Sie getroffen, um Ihre where-Klausel oder Unterabfrage in CTE, auf jeden Fall wird es Performance-Verbesserung zeigen.
Referenz: http://msdn.microsoft.com/ en-us / library / ms190766 (v = SQL.105) aspx
Nur eine Notiz, in vielen Szenarien gibt Temptabellen bessere Leistung dann CTE auch, so dass Sie einen Versuch, um temporäre Tabellen und geben sollen.
Referenz: http: //social.msdn .microsoft.com / Foren / en / TRANSACTSQL / thread / d040d19d-016E-4a21-bf44-a0359fb3c7fb