Het antwoord is simpel.
SQL Server realiseert geen CTE's. Het lijnt ze uit, zoals je kunt zien aan de uitvoeringsplannen.
Andere DBMS kan het anders implementeren, een bekend voorbeeld is Postgres, dat CTE's materialiseert (het creëert in wezen tijdelijke tabellen voor CTE's achter de motorkap).
Of expliciete materialisatie van tussenresultaten in expliciete tijdelijke tabellen sneller gaat, hangt af van de query.
Bij complexe query's kan de overhead van het schrijven en lezen van intermediaire gegevens in tijdelijke tabellen worden gecompenseerd door efficiëntere, eenvoudigere uitvoeringsplannen die de optimizer kan genereren.
Aan de andere kant, in Postgres is CTE een "optimalisatiehek" en kan de engine de predikaten niet over de CTE-grens duwen.
Soms is de ene manier beter, soms een andere. Zodra de complexiteit van de query een bepaalde drempel overschrijdt, kan een optimiser niet alle mogelijke manieren analyseren om de gegevens te verwerken en moet hij ergens genoegen mee nemen. Bijvoorbeeld de volgorde waarin de tabellen worden samengevoegd. Het aantal permutaties groeit exponentieel met het aantal tabellen waaruit u kunt kiezen. Optimizer heeft beperkte tijd om een plan te genereren, dus het kan een slechte keuze zijn wanneer alle CTE's inline zijn. Wanneer u complexe zoekopdrachten handmatig in kleinere, eenvoudigere opdeelt, moet u begrijpen wat u doet, maar de Optimizer heeft een grotere kans om een goed plan voor elke eenvoudige zoekopdracht te genereren.