CTE улучшают производительность? - PullRequest
1 голос
/ 29 июля 2011
with ini as
(
    select ... 
)
select ini.a 
join ini.b 
join ini.c

Сколько раз подсистема SQL Server calculate получает результаты из таблицы ini?

На мой вопрос, на который я пытаюсь ответить (с вашей помощью), если *Заявление 1006 * (CTE) повышает производительность на aliasing результаты.

Ответы [ 3 ]

2 голосов
/ 29 июля 2011

CTE ini - это просто макрос, который расширяется, и это использование только для синтаксиса / ясности. MSDN говорит:

Использование CTE предлагает преимущества улучшенной читаемости и простоты обслуживания сложных запросов

Ничего о производительности.

Он оценивается за упоминание : так три раза здесь, что вы можете увидеть из плана выполнения.

Для рекурсивных CTE это несколько отличается, поскольку CTE строится на себе, но все равно будет оцениваться один раз за упоминание

1 голос
/ 29 июля 2011

CTE (общее табличное выражение, часть, заключенная в «с») - это, по сути, одноразовое представление. Если вы думаете об этом с точки зрения временного представления, возможно, ответ станет более ясным. Насколько я знаю, интерпретатор просто сделает эквивалент копирования / вставки всего, что находится в CTE, в основной запрос, где бы он ни находил ссылку.

Я уверен, что есть внешние случаи, когда это кажется полезным, но чаще всего я бы предположил, что простое присутствие самого CTE не улучшит производительность запроса. Это поможет с удобочитаемостью и возможностью повторного использования в этом единственном операторе выбора (т. Е. Вам не нужно будет повторно вводить один и тот же подзапрос несколько раз), но я не верю, что это волшебным образом заставит вещи работать быстрее ( при прочих равных условиях). Конечно, если ваш запрос структурирован в CTE иначе, чем вы бы делали с подзапросами, то вполне возможно, что CTE в этот момент работает быстрее, но теперь вы сравниваете яблоки с апельсинами.

0 голосов
/ 29 июля 2011

Полагаю, это также будет зависеть от того, использовали ли вы его для замены производной таблицы или коррелированного подзапроса.В первом случае производительность была бы примерно такой же, а во втором, вероятно, значительно выше, если бы вы присоединились к CTE, а не просто заменили код запроса на ссылку на CTE.Если бы вы использовали его для замены предложения where NOT EXISTS левым соединением с CTE (чтобы найти записи в одной таблице, но не в другой), я бы ожидал, что производительность будет хуже, так как Where Exists - это обычно быстрый способчтобы сделать этот тип задачи.Я предполагаю, что я говорю о том, что производительность все равно будет зависеть от того, как вы используете CTE, а не только от того, что вы его сгенерировали.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...