2015-06-18 19 views
7

Meine Frage hier ist, was ist der Unterschied zwischen CTE und View in SQL. Ich meine, in diesem Fall sollte ich die CTE und den Fall der View verwenden. Ich weiß, dass beide eine Art virtuelle Tische sind, aber ich kann ihre Verwendung nicht unterscheiden.SQL - CTE vs VIEW

Ich fand eine ähnliche Frage here, aber es geht um die Leistung.

Update 1:

Zum Beispiel: Ich habe eine Datenbank mit Geschäften gefüllt (tbl_trade). Ich muss aus 3.5 Millionen Datensätze nur die Trades auswählen, die den aktuellen Monat bis zur aktuellen Zeit geöffnet wurden und dann die Daten manipulieren (mit unterschiedlichen Abfragen auf der virtuellen Tabelle - das sieht wie View aus). Das Problem hier ist, dass ich eine SUM 3-4 Spalten und dann auf Ich brauche SUM einige Spalten und erstellen Sie eine virtuelle Spalte mit dem Ergebnis (sieht aus wie CTE).

ZB: tbl_trade hat Spalten: profit, bonus und expenses. Ich brauche SUM(profit), SUM(bonus), SUM(expenses) und eine neue Spalte total, die gleich SUM(profit) + SUM(bonus) + SUM(expenses) ist.

PS. Das Ausführen der Abfragen für SUM ist keine Option, da ich bereits das Ergebnis habe.

Vielen Dank im Voraus!

+2

Eine Ansicht ist ein Objekt in der Datenbank. Ein CTE existiert nur für die Dauer einer einzelnen Abfrage. Sie scheinen sehr unterschiedlich zu sein. Können Sie ein Beispiel für die Wahl zwischen ihnen geben? –

+0

Wie viele Daten haben Sie? CTE verwendet TempDb ausgiebig und wenn Ihr TempDb nicht richtig konfiguriert ist oder Ihr CTE eine große Anzahl von Zeilen verarbeitet, ist es nicht die beste Wahl. Wählen Sie View, wenn Sie mit großen Datenmengen und CTE mit kleinen Datenmengen arbeiten. Sie können CTE auch auswählen, wenn Sie eine Rekursion benötigen. Das ist alles ! –

+0

Hallo und danke für deine Antworten. Siehe die aktualisierten Fragen – BlackM

Antwort

11

Ansichten können indiziert werden, aber CTE kann nicht. Das ist also ein wichtiger Punkt.

CTE Arbeit ausgezeichnet auf tree hierarchy heißt rekursive

Auch Ansichten berücksichtigen, wenn mit komplexen Abfragen zu tun. Ansichten, die ein physisches Objekt in der Datenbank sind (aber nicht physisch speichern) und für mehrere Abfragen verwendet werden können, bieten somit Flexibilität und zentralisierten Ansatz. CTE hingegen sind temporär und werden bei ihrer Verwendung erstellt; deshalb heißen sie inline view.

aktualisieren

Nach Ihrer Frage aktualisiert werden Ansichten die richtige Wahl sein. Der Umgang mit 3.5 Millionen Zeilen in CTE wird zusätzlichen Overhead auf TempDb verursachen, der schließlich die SQL Server-Leistung verlangsamen wird.Denken Sie daran, CTE ist eine Einwegansicht, daher werden keine Statistiken gespeichert und Sie können auch keine Indizes erstellen. Es ist wie eine Unterabfrage.

+0

"CTE funktioniert nicht sehr gut mit großen Datenmengen im Vergleich zu Ansichten" Das ist nicht wahr. Es gibt keinen Unterschied zwischen einem CTE und einer Ansicht, es sei denn, die Ansicht wird indiziert. –

+0

Kann ich aber 'column1 + column2 als column3' hinzufügen und in der Query darstellen? – BlackM

+0

@MikaelEriksson Wahr, aber bei meiner Prüfung auf große Datenmenge [rekursiv] fand ich hohe tempdb Nutzung, also geringe Leistung. Trotzdem glaube ich, dass Ihr Kommentar korrekt ist und ich meine Antwort modifiziere. –

3

Einer der Gründe für CTE: Wenn Sie hierarchische Abfragen durchführen, verwenden Sie CTEs. CTEs können rekursiv aufgerufen werden. Ansichten können nicht rekursiv aufgerufen werden.

6

Beide werden vom Plan Optimizer genau gleich interpretiert. Es ist nur eine andere Sache.

Eine Ansicht kann für sich alleine verwendet werden. Es kann komplexe Anweisungen in eine einfachere Abfrage einkapseln.

Ein CTE wird meistens verwendet, um saubereren Code mit geringerer Redundanz in Prozeduren/Ansichten zu schreiben. Sie können ein CTE auch für rekursive Abfragen verwenden, was eine sehr gute und mächtige Funktion ist!

Ich hoffe, dies hilft, Dinge zu klären.