2010-07-26 3 views
6

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

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

(редактирование: BTW, я бегу это на SQL Server '08 R2.)

+0

Пользователь Stackoverflow Quassnoi http://stackoverflow.com/users/55159/quassnoi написал интересную статью об этом. http://explainextended.com/2009/05/28/generating-xml-in-subqueries/ –

+0

Это интересно. Я не работаю ни при каких ограничениях, как он описывает (например, через ORM, который не позволяет создавать временные таблицы), поэтому я не понимаю, почему его метод лучше, чем временные таблицы - и, очевидно, если вы жестко программируете план например, это большая стоимость обслуживания при изменении запроса. Тем не менее, действительно полезный взгляд на то, как план выполнения контролирует это поведение. – alphabasic

ответ

4

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

Смежные вопросы