14

Czy korzystanie z CTE (wspólne wyrażenia tabelowe) przynosi korzyści zamiast używania tabel tymczasowych.Jakie są główne różnice między tabelami CTE i TEMP?

Przeszedłem testy wydajności między obiema, ale nie mogę znaleźć dużej różnicy między nimi. Jakie są plusy i minusy używania CTE?

+9

Z witryny DBA [Jaka jest różnica między CTE i tabeli temp?] (Http://dba.stackexchange.com/q/13112/ 3690) –

+0

Nie wiem zbyt wiele o różnicach w wydajności, ale cte pozwalają na proste zapętlenie i rekursję, tabele tymczasowe są przydatne, jeśli dane wyjściowe zapytania będą dostępne wielokrotnie, a ponowne uruchomienie byłoby stratą czasu. –

+1

Są to różne rzeczy, a tak naprawdę to konie na kursy. Który z nich jest najlepszy, zależy od dokładnego scenariusza. Twoje pytanie jest nie mniej dwuznaczne niż "Jakie są zalety używania widoków zamiast tabel?". – GarethD

Odpowiedz

12

Prawdopodobnie największą różnicą między tabelą CTE i tabelą tymczasową jest to, że CTE ma zakres wykonywania pojedynczej instrukcjiSELECT, INSERT, UPDATE, DELETE lub CREATE VIEW.

Zasadniczo nie można ponownie użyć CTE, tak jak w przypadku tabel tymczasowych.

Z documentation

Wyrażenie wspólny stół (CTE) może być traktowany jako tymczasowy wynikowego zestawu, który jest zdefiniowany w zakresie wykonania pojedynczy SELECT, INSERT, UPDATE, DELETE lub CREATE VIEW instrukcja. CTE to podobny do wyprowadzonej tabeli, ponieważ nie jest przechowywany jako obiekt i trwa tylko przez czas trwania zapytania. W przeciwieństwie do wyprowadzonej tabeli, CTE może być odwoływaniem się do siebie i może być przywoływane wielokrotnie w tej samej kwerendzie w .

CTE może być stosowany do:

  1. Utwórz kwerendę cykliczną. Aby uzyskać więcej informacji, zobacz Kwerendy cykliczne przy użyciu typowych wyrażeń tabelarycznych.

  2. Zastępuje widok, gdy ogólne użycie widoku nie jest wymagane; to znaczy, nie musisz przechowywać definicji w metadanych.

  3. Włącz grupowanie według kolumny uzyskanej z podselekcji skalarnej lub funkcji, która nie jest deterministyczna lub ma zewnętrzny dostęp.

  4. Odwołanie wynikowej tabeli wiele razy w tej samej instrukcji.

+17

Największa różnica polega na tym, że jedna jest rzeczywistą tabelą, a druga nie. Istnieje duża różnica między 'WITH CTE AS (SELECT * FROM MillionRowTable) SELECT TOP 1 * FROM CTE' i' INSERT INTO #T SELECT * FROM MillionRowTable; SELECT TOP 1 * FROM # T' –

+2

@MartinSmith Twój komentarz ma więcej głosów niż sama odpowiedź !! –

+0

Może też przejść w drugą stronę: 'wstaw do # tabeli', a następnie' wybierz .. gdzie xyz nie w # tabeli' jest szybki, ale przepisanie jako CTE powoduje, że jest on bardzo wolny. –

3

CTE: CTE oznacza potoczne Stołowych. Został wprowadzony w SQL Server 2005. Służy do przechowywania wyniku złożonego zapytania podrzędnego na tymczasowych bazach. Jego życie jest ograniczone do bieżącego zapytania. Jest zdefiniowany za pomocą instrukcji WITH. Używano go głównie do wywoływania rekursywnego.

Przykład

;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 
) 

(błąd)

select top (5) * from myCTE 

więc w powyższym przykładzie, mają tworzyć nazwę CTE jako myCTE, które mogą być stosowane tylko w powyższym zapytania (mogę nie używać strony myCTE poza powyższym zapytaniem)

TEMP: Służy również do przechowywania wyniku zapytania na tymczasowych bazach. Ale jego życie jest ograniczone do bieżącej sesji. Jest zdefiniowany za pomocą #. Nie obsługuje rekurencji.

przykład:

select * into #tempTable from MHA 

podano zapytania Utworzono temp tabeli teraz można go używać tabeli temp z boku tego zapytania, ale z sesji. Zobacz poniżej

(bez błędu)

select top (5) * from #tempTable 
Powiązane problemy