Характеристики производительности CTE T-SQL - PullRequest
6 голосов
/ 26 июля 2010

У меня есть 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.)

1 Ответ

4 голосов
/ 26 июля 2010

CTE могут быть лучше или хуже, просто в зависимости от того, как они используются (включая понятия рекурсии, индексации и т. Д.).Вы можете найти эту статью интересной: http://www.sqlservercentral.com/articles/T-SQL/2926/

...