14

Gibt es einen Vorteil für die Verwendung von CTEs (gemeinsame Tabellenausdrücke) anstelle der Verwendung von temporären Tabellen.Was ist der Hauptunterschied zwischen CTEs und TEMP-Tabellen?

Ich habe Leistungstests zwischen beiden gemacht, aber ich kann keinen großen Unterschied zwischen ihnen finden. Was sind die Vor- und Nachteile der Verwendung von CTE?

+9

Von der DBA-Website [Was ist der Unterschied zwischen einem CTE und einer Temp-Tabelle?] (Http://dba.stackexchange.com/q/13112/ 3690) –

+0

Ich weiß nicht viel über die Leistungsunterschiede, aber CTE's ermöglichen einfache Schleife und Rekursion, temporäre Tabellen sind praktisch, wenn auf eine Abfrage-Ausgabe mehrfach zugegriffen wird und das erneute Ausführen Zeitverschwendung wäre. –

+1

Sie sind verschiedene Dinge, und wirklich ist es Pferde für Kurse. Welche davon am besten ist, hängt von Ihrem genauen Szenario ab. Ihre Frage ist nicht weniger eindeutig als "Was sind die Vorteile der Verwendung von Ansichten anstelle von Tabellen?" – GarethD

Antwort

12

Der wahrscheinlich größte Unterschied zwischen einer CTE- und einer temporären Tabelle besteht darin, dass der CTE einen Ausführungsbereich von SELECT-, INSERT-, UPDATE-, DELETE- oder CREATE VIEW-Anweisungen hat.

Im Wesentlichen können Sie die CTE nicht wiederverwenden, wie Sie mit temporären Tabellen können.

Vom documentation

Eine gemeinsame Tabellenausdruck (CTE) kann als eine temporäre Ergebnismenge betrachtet werden, die innerhalb der Ausführungsumfang ein einzelner definiert ist SELECT, INSERT, UPDATE, DELETE oder CREATE VIEW-Anweisung. Ein CTE ist ähnlich einer abgeleiteten Tabelle, in der es nicht als ein Objekt gespeichert wird und dauert nur für die Dauer der Abfrage. Im Gegensatz zu einer abgeleiteten Tabelle kann ein CTE mit selbstreferenzierend sein und mehrmals in dieselbe Abfrage referenziert werden.

  1. eine rekursive Abfrage erstellen:

    kann ein CTE verwendet werden. Weitere Informationen finden Sie unter Rekursive Abfragen mit allgemeinen Tabellenausdrücken.

  2. Ersatz für eine Ansicht, wenn die allgemeine Verwendung einer Ansicht nicht erforderlich ist; Das heißt, Sie müssen die Definition nicht in Metadaten speichern.

  3. Aktivieren Sie die Gruppierung nach einer Spalte, die von einem skalaren Subselect abgeleitet ist, oder von einer Funktion, die entweder nicht deterministisch ist oder externen Zugriff hat.

  4. Referenzieren Sie die resultierende Tabelle mehrmals in derselben Anweisung.

+17

Der größte Unterschied zu mir ist, dass man eine tatsächliche Tabelle ist und die andere nicht ist. Es gibt einen großen Unterschied zwischen 'WITH CTE AS (SELECT * VON MillionRowTable) SELECT TOP 1 * FROM CTE' und' INSERT INTO #T SELECT * FROM MillionRowTable; SELECT TOP 1 * FROM # T' –

+2

@MartinSmith Ihr Kommentar hat mehr Stimmen als die Antwort selbst !! –

+0

Es kann auch andersherum gehen: 'einfügen in # table' gefolgt von' select .. wo xyz nicht in # table' ist schnell, aber das Umschreiben als CTE macht es super langsam. –

3

CTE: CTE steht für Common Table Expressions. Es wurde mit SQL Server 2005 eingeführt. Es wird verwendet, um das Ergebnis einer komplexen Unterabfrage auf temporären Datenbanken zu speichern. Ihr Leben ist auf die aktuelle Abfrage beschränkt. Es wird mit WITH-Anweisung definiert. Es wird hauptsächlich für rekursive Aufrufe verwendet.

Beispiel

;with myCTE as 
(
    select ParentLevel, ParentID, ChildID 
    from MHA 
    where ChildID = 1 
    UNION ALL 
    select MHA.ParentLevel, MHA.ParentID, MHA.ChildID 
    from MHA 
    inner join myCTE on MHA.ParentID = myCTE.ChildID 
    where MHA.ParentID <> 0 
) 

(Fehler)

select top (5) * from myCTE 

so in obigem Beispiel habe ich CTE Namen wie myCTE erstellen, die nur in obiger Abfrage verwendet werden können (kann ich Verwenden Sie nicht myCTE außerhalb der obigen Abfrage)

TEMP: Es wird auch verwendet, um das Ergebnis der Abfrage auf temporären Basen zu speichern. Aber seine Lebensdauer ist auf die aktuelle Sitzung beschränkt. Es wird mit # definiert. Es unterstützt nicht rekursiv.

Beispiel:

select * into #tempTable from MHA 

In obiger Abfrage ich temporäre Tabelle erstellt habe, jetzt kann ich es Temptabelle out Seite dieser Abfrage verwenden, aber mit in der Sitzung. Siehe unten

(kein Fehler)

select top (5) * from #tempTable