EDYTOWAĆ:
Zobacz komentarze Martina poniżej:
CTE nie jest zmaterializowany jako tabela w pamięci. To tylko sposób na zawarcie definicji zapytania. W przypadku PO będzie on wstawiony i to samo, co po prostu robienie SELECT Column1, Column2, Column3 FROM SomeTable
. Przez większość czasu nie zostają zmaterializowane z góry, dlatego nie zwraca żadnych wierszy WITH T(X) AS (SELECT NEWID())SELECT * FROM T T1 JOIN T T2 ON T1.X=T2.X
, sprawdź także plany wykonania. Chociaż czasami można zhakować plan, aby uzyskać szpulę. Istnieje element połączeniowy z prośbą o podpowiedź. - Martin Smith 15 lutego 12 'o 17:08
Oryginalna odpowiedź
CTE
Przeczytaj więcej na MSDN
CTE tworzy tabelę używaną w pamięci, ale jest poprawna tylko dla określonego zapytania po niej. Podczas korzystania z rekurencji może to być efektywna struktura.
Możesz również rozważyć użycie zmiennej tabeli. Jest to używane, ponieważ używana jest tabela tymczasowa i może być używana wiele razy, bez potrzeby ponownego zmaterializowania dla każdego połączenia. Ponadto, jeśli musisz teraz zachować kilka rekordów, dodaj kilka kolejnych rekordów po kolejnym wyborze, dodaj jeszcze kilka rekordów po kolejnej operacji, a następnie zwróć tylko garść rekordów, to może być przydatna struktura, ponieważ nie trzeba go upuszczać po wykonaniu. Głównie tylko cukier syntaktyczny. Jeśli jednak utrzymasz niską liczbę wierszy, nigdy nie pojawi się ona na dysku. Zobacz Jaka jest różnica między tabelą tymczasową a zmienną tabelową w programie SQL Server? po więcej szczegółów.
Tabela temperatur
Przeczytaj więcej na MSDN - Przewiń w dół o około 40%
Tabela tymczasowa to dosłownie tabela utworzona na dysku, tylko w określonej bazie danych, o której wszyscy wiedzą, że można ją usunąć. Dobry deweloper jest odpowiedzialny za zniszczenie tych tabel, gdy nie są już potrzebne, ale DBA może je również wyczyścić.
Stoły tymczasowe występują w dwóch odmianach: lokalnej i globalnej. W odniesieniu do MS Sql Server używasz #tableName
oznaczenia lokalnego i ##tableName
globalnego (zwróć uwagę na użycie pojedynczego lub podwójnego # jako cechy identyfikującej).
Zauważ, że w przypadku tabel tymczasowych, w przeciwieństwie do zmiennych tabel lub CTE, możesz zastosować indeksy i tym podobne, ponieważ są to legalne tabele w normalnym znaczeniu tego słowa.
Zasadniczo korzystałbym z tabel tymczasowych dla dłuższych lub większych zapytań oraz zmiennych CTE lub zmiennych tabel, gdybym miał już mały zestaw danych i chciałem po prostu szybko napisać trochę kodu dla czegoś małego. Doświadczenie i porady innych wskazują, że powinieneś używać CTE tam, gdzie zwracana jest niewielka liczba wierszy. Jeśli masz dużą liczbę, prawdopodobnie skorzystasz z możliwości indeksowania w tabeli tymczasowej.