Рабочие характеристики T-SQL CTEs

У меня есть некоторый 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 и использую его, конечно, он выполняет запрос однажды, помещает результат во временную таблицу и запросы это с тех пор. В моем конкретном экземпляре, который заставляет все это работать намного быстрее.

Мой вопрос: Это всегда, что я могу ожидать от CTEs (не memoizing результаты всегда, так же, как если бы он встраивал запрос везде?) Там причина, что SQL Server не мог оптимизировать это лучше? Обычно я трепещу в том, насколько умный оптимизатор, но я удивлен, что он не мог понять это.

(редактирование: BTW, я выполняю это на SQL Server '08 R2.)

6
задан marc_s 27 July 2010 в 04:42
поделиться