Из MSDN :
В отличие от производной таблицы, CTE может иметь самоссылку и на нее можно ссылаться несколько раз в одном запросе.
Я использую CTE довольно часто, но я никогда не задумывался о преимуществах их использования.
Если я ссылаюсь на CTE несколько раз в одном запросе:
- Есть ли какой-то выигрыш в производительности?
- Если я делаю самостоятельное соединение, будет ли SQL Server сканировать целевые таблицы дважды?
sql-server
cte
Ройи Намир
источник
источник
Ответы:
Как правило, CTE НИКОГДА не улучшит производительность .
CTE по сути одноразовый вид. Здесь не хранятся дополнительные статистические данные, индексы и т. Д. Он работает как сокращение для подзапроса.
По моему мнению, они могут быть легко перегружены (я вижу много перерасхода кода в моей работе). Здесь есть несколько хороших ответов, но если вам нужно сослаться на что-то более одного раза, или если это несколько сотен тысяч строк, поместите это в
#temp
таблицу и проиндексируйте.источник
CTE
является плохим выбором, поскольку результаты отбрасываются после первого запроса.Помимо рекурсии, я считаю, что CTE невероятно полезны при создании сложных отчетов. Я использую серию CTE, чтобы получить фрагменты нужных мне данных, а затем объединить в окончательном выборе. Я нахожу, что их легче поддерживать, чем делать одно и то же с большим количеством производных таблиц или 20 объединений, и я могу быть уверен, что он вернет правильные данные без влияния нескольких записей из-за отношений один-много в все разные соединения. Позвольте мне привести быстрый пример:
Таким образом, выделив различные порции информации, которую вы хотите, вы можете проверить каждую часть в отдельности (используя закомментированные варианты выбора, раскомментировав каждую из них по отдельности и выполняя только эту выборку), и если вам нужно внести изменения в расход Расчет (в этом примере) найти легче, чем когда все они объединены в один массивный запрос. Конечно, фактические запросы отчетов, для которых я использую это, обычно намного сложнее, чем в примере.
источник
Как всегда это зависит, но бывают случаи, когда производительность значительно улучшается. Я вижу это с помощью операторов INSERT INTO SELECT, где вы используете CTE для выбора, а затем используете его в INSERT INTO. Возможно, это связано с тем, что для базы данных установлен RCSI, но в тех случаях, когда выбрано очень мало, это может очень помочь.
источник