2015-06-18 15 views
7

Moje pytanie dotyczy różnicy między CTE a View w SQL. Chodzi mi o to, w którym przypadku powinienem użyć CTE, a w przypadku View. Wiem, że oba są wirtualnymi stołami, ale nie potrafię ich rozróżnić.SQL - CTE vs VIEW

Znalazłem podobne pytanie here, ale chodzi o wydajność.

Aktualizacja 1:

Na przykład: Mam bazę danych wypełnioną transakcji (tbl_trade). Muszę wybrać z 3,5 milionów rekordów tylko transakcje, które zostały otwarte w bieżącym miesiącu do bieżącego czasu, a następnie manipulować danymi (z różnymi zapytaniami na wirtualnym stole - wygląda to jak View). Problem polega na tym, że chcę SUM z 3-4 kolumn, a następnie muszę SUM niektóre kolumny i utworzyć wirtualną kolumnę z wynikiem (wygląda jak CTE).

Np .: tbl_trade ma kolumny: profit, bonus i expenses. Potrzebuję SUM(profit), SUM(bonus),i nową kolumnę total, która będzie równa SUM(profit) + SUM(bonus) + SUM(expenses).

PS. Ponowne sprawdzanie zapytań o numer SUM nie jest opcją, ponieważ mam już wynik.

Z góry dziękuję!

+2

Widok jest obiektem w bazie danych. CTE istnieje tylko przez czas trwania pojedynczego zapytania. Wydają się zupełnie inne. Czy możesz podać przykład wyboru między nimi? –

+0

Ile danych masz do czynienia? CTE intensywnie używa TempDb i jeśli twój TempDb nie jest poprawnie skonfigurowany lub twój CTE ma do czynienia z dużą liczbą rzędów, to nie jest to najlepszy zakład. Wybierz opcję View, gdy masz do czynienia z dużą ilością danych, a CTE z małą. Możesz wybrać CTE również wtedy, gdy potrzebujesz rekursji. To wszystko ! –

+0

Witam i dziękuję za odpowiedzi. zobacz zaktualizowane pytania – BlackM

Odpowiedz

11

Widoki można indeksować, ale nie można ich edytować. To jedna ważna kwestia.

CTE doskonała praca na tree hierarchy tj rekurencyjne

także rozważyć widoki gdy mamy do czynienia ze złożonymi zapytaniami. Widoki będące fizycznym obiektem w bazie danych (ale nie przechowują danych w sposób fizyczny) i mogą być używane w wielu zapytaniach, dzięki czemu zapewniają elastyczność i scentralizowane podejście. Z kolei CTE są tymczasowe i zostaną utworzone, gdy zostaną użyte; dlatego są nazywane jako inline view.

Aktualizacja

Według zaktualizowanego pytanie, widoki będzie właściwym wyborem. Radzenie sobie z 3,5 milionami wierszy w CTE spowoduje dodatkowe obciążenie na TempDb, które ostatecznie spowolni wydajność SQL Server.Pamiętaj, że CTE jest widokiem jednorazowym, więc nie są przechowywane żadne statystyki i nie możesz też tworzyć indeksów. Jest to podobne do zapytania podrzędnego.

+0

"CTE nie działa całkiem dobrze z dużą ilością danych w porównaniu do widoków" To nie jest prawda. Nie ma różnicy między CTE i widokiem, chyba że widok jest indeksowany. –

+0

Ale czy mogę dodać kolumnę 1 + kolumnę 2 jako kolumnę 3 i przedstawić ją w zapytaniu? – BlackM

+0

@MikaelEriksson Prawda, ale na moich testach na dużej ilości danych [rekursywna] znalazłem wysokie użycie tempdb, a więc niską wydajność. Jednak nadal uważam, że Twój komentarz jest poprawny i modyfikuję odpowiedź. –

3

Jednym z powodów wyboru CTE: Jeśli wykonujesz zapytania hierarchiczne, użyj CTE. CTE można nazwać rekurencyjnie. Widoki nie mogą być wywoływane rekurencyjnie.

6

Obie będą interpretowane dokładnie tak samo przez Optymalizator planu. To po prostu inna sprawa.

Widok może być używany samodzielnie. Może enkapsulować złożone instrukcje do bardziej prostego zapytania.

Gdy CTE jest najczęściej używany do pisania czystszego kodu z mniejszą nadmiarową w procedurach/widokach na przykład. Możesz użyć CTE również do rekursywnych zapytań, co jest bardzo przydatną i potężną funkcją!

Mam nadzieję, że pomoże to wyjaśnić pewne kwestie.