Если вы не используете рекурсивные способности, CTE
не лучше с точки зрения производительности, чем простое встроенное представление.
Это просто экономит вам время при наборе текста.
Оптимизатор может решатьпереоценивать его или нет, когда он используется повторно, и в большинстве случаев он решает переоценить:
WITH q (uuid) AS
(
SELECT NEWID()
)
SELECT *
FROM q
UNION ALL
SELECT *
FROM q
вернет вам два разных NEWIDs
.
Обратите внимание, что другие движки могутвести себя по-другому.
PostgreSQL
, в отличие от SQL Server
, материализует CTEs
.
Oracle
поддерживает специальную подсказку /*+ MATERIALIZE */
, которая сообщает оптимизатору, следует ли ему материализовать CTE
или нет.