2015-04-27 8 views
1

Итак, я разработчик SQL на уровне промежуточного уровня, и в последнее время я наблюдаю массу обсуждений, связанных с CTE (Common Table Expressions). Везде я смотрю, я вижу, как люди говорят, что это эта удивительная вещь:SQL - зачем использовать CTE?

КТР (Common Table Expressions) являются одним из самых красивых и самых мощных особенность SQL Server и находкой для разработчиков SQL Server. Это не только упрощает большинство сложных операций в T-SQL, но и делает намного больше, чем можно себе представить.

Комментарий пользователя к статье Microsoft Technet по использованию CTE.

Из-за того, что я видел и читал в Интернете, CTE по существу является просто «самонаполняющейся» временной таблицей, которую можно использовать только один раз. Единственное преимущество, которое я вижу, это то, что CTE очищает себя, в отличие от временной таблицы, связанной с сеансом. Я также видел много комментариев о рекурсии, но никогда не сталкивался с ситуацией, когда мне нужно было ее использовать; Я чувствую, что это очень специфично для определенного типа проблем?

Вкратце: Являются ли CTE сугубо косвенными или я пропустил что-то чрезвычайно мощное здесь? Я еще не вижу реальной выгоды от использования CTE по временной таблице.

+3

Помимо того, что они могут быть рекурсивными, не так ли сложно уменьшить сложность в sql? Мне этого достаточно, чтобы регулярно их использовать. Мощный может означать: 1.более читаемый 2.более ремонтопригодный 3. безопасный –

+2

Как вы только что сказали, рекурсия - одно из преимуществ, факт, что вы не сталкивались с ситуацией, когда вам это нужно, не нужно, чтобы это не принесло пользы , Еще одна большая для меня читаемость. Вы можете перейти к [этой ссылке] (http://dba.stackexchange.com/questions/14490/common-table-expression-cte-benefits), чтобы узнать больше о них – Lamak

+0

В этом проблема: я не вижу, как они уменьшить сложность. Я понимаю, что вы можете разбить запрос на более мелкие разделы, но я могу сделать это с помощью Temp Tables. Извините, возможно, лучший вопрос: зачем мне когда-либо использовать CTE, когда я мог бы использовать гораздо более гибкую (IMO) таблицу temp, которая позволяет мне манипулировать данными и продолжать использовать ее для жизненного цикла инструкции/процедуры? Что касается читаемости, мне придется привыкнуть к этому. Поскольку я их не использую, я не знаком с синтаксисом, который делает чтение более трудным для меня - это на 100% только кривая обучения. –

ответ

2

CTE обычно считается более читаемым, чем временная таблица, хотя это, вероятно, вопрос вкуса. Тем не менее, что более важно, CTE может быть самореференцией и может быть даже многократно упоминаться в одном запросе. Это позволяет разрабатывать рекурсивные запросы, очень мощную функцию при запросе иерархических структур данных.

Как известно, при использовании CTE обычно возникают служебные издержки, в частности, при использовании нескольких CTE в одном запросе. Как правило, быстрее использовать временные таблицы с подходящими индексами, также см. Комментарий @ bogdan-bogdanov.

+0

Я согласен, но их следует использовать с осторожностью с моей точки зрения - если не правильно настроены - рекурсия может привести к замедлению. У меня когда-то была такая проблема. Чтобы сделать код более читаемым и избежать подзапросов, я делаю CTE, но мой код был не очень корректным, и рекурсия приводит к замедлению. –

0

Когда вы думаете о том, как работает запрос, вы должны рассмотреть подзапросы как выполняющиеся перед внешним запросом. Поэтому сложный запрос может быть трудно читать и понимать, когда вы прыгаете и мысленно рассматриваете набор результатов каждого подзапроса. Это также делает навязчивым комментарий/документ вложенных подзапросов.

Когда вы переместите подзапрос в CTE, тогда это лучше представлено, поскольку оно становится списком сверху вниз, а не вложенными подзапросами. Это облегчает просмотр потока запроса, поскольку верхний запрос возвращает результат, который часто ссылается на более поздний запрос. Это облегчает прокомментировать каждый КТР, чтобы описать, какова его конкретная цель.