CTE es solo un alias para la consulta.
Puede (o no) volver a ejecutarse cada vez que se usa.
No hay una forma limpia de forzar CTE materialización en SQL Server (como /*+ MATERIALIZE */ de Oracle ), y tienes que hacer trucos sucios como este:
CTE puede mejorar el rendimiento si se usa en planes que requieren solo una evaluación (como HASH JOIN , MERGE JOIN etc.).
En estos escenarios, la tabla hash se construirá directamente desde el CTE , mientras que el uso de la tabla temporal requerirá evaluar el CTE , introduciendo los resultados en la tabla temporal y leyendo la tabla temporal una vez más.