У меня есть SQL, который выглядит примерно так:
with InterestingObjects(ObjectID, OtherInformation, Whatever) as (
select X.ObjectID, Y.OtherInformation, Z.Whatever
from X join Y join Z -- abbreviated for brevity
)
-- ...long query follows, which uses InterestingObjects in several more CTEs,
-- and then uses those CTEs in a select statement at the end.
Когда я запускаю его, в плане выполнения я вижу, что он, по-видимому, выполняет запрос в CTE практически каждый раз, когда ссылается на CTE. Если я вместо этого создаю временную таблицу #InterestingObjects и использую ее, конечно, она запускает запрос один раз, помещает результат во временную таблицу и запрашивает его с тех пор. В моем конкретном случае это заставляет все работать намного быстрее.
У меня вопрос: всегда ли это то, что я могу ожидать от CTE (не запоминать результаты каким-либо образом, как если бы он везде вставлял запрос?) Обычно я в восторге от того, насколько умным является оптимизатор, но я удивлен, что он не может понять это.
(редактирование: кстати, я запускаю это на SQL Server '08 R2.)