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.

War es hilfreich?

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top