SQL jest językiem deklaratywnym, a nie proceduralnym. Oznacza to, że tworzysz instrukcję SQL, aby opisać żądane wyniki. Nie mówisz silnikowi SQL jak wykonać pracę.
Zasadniczo dobrym pomysłem jest umożliwienie silnikowi SQL i optymalizatorowi SQL znalezienie najlepszego planu zapytań. Opracowanie silnika SQL wymaga wielu osobo-lat wysiłku, więc pozwól inżynierom robić to, co potrafią.
Oczywiście zdarzają się sytuacje, w których plan zapytania nie jest optymalny. Następnie chcesz użyć wskazówek dotyczących zapytań, zmienić strukturę zapytania, zaktualizować statystyki, użyć tabel tymczasowych, dodać indeksy itd., aby uzyskać lepszą wydajność.
Co do twojego pytania. Wydajność CTE i podzapytań powinna teoretycznie być taka sama, ponieważ oba dostarczają te same informacje do optymalizatora zapytań. Jedną z różnic jest to, że CTE użyty więcej niż jeden raz można łatwo zidentyfikować i obliczyć raz. Wyniki można następnie wielokrotnie przechowywać i odczytywać. Niestety, wydaje się, że SQL Server nie wykorzystuje tej podstawowej metody optymalizacji (można nazwać to eliminacją podzapytania).
Tabele tymczasowe to inna sprawa, ponieważ dostarczasz więcej wskazówek dotyczących sposobu uruchamiania zapytania. Jedną z głównych różnic jest to, że optymalizator może używać statystyk z tabeli tymczasowej do ustalenia planu zapytań. Może to spowodować wzrost wydajności. Ponadto, jeśli masz skomplikowane CTE (podzapytanie), które jest używane więcej niż jeden raz, przechowywanie go w tabeli tymczasowej często zwiększa wydajność. Zapytanie jest wykonywane tylko raz.
Odpowiedź na Twoje pytanie jest taka, że musisz się pobawić, aby uzyskać oczekiwaną wydajność, szczególnie w przypadku złożonych zapytań, które są uruchamiane regularnie. W idealnym świecie optymalizator zapytań znalazłby idealną ścieżkę wykonania. Chociaż często tak się dzieje, możesz znaleźć sposób na uzyskanie lepszej wydajności.