РЕДАКТИРОВАТЬ:
Пожалуйста, смотрите комментарии Мартина ниже:
CTE не материализуется как таблица в памяти. Это просто способ инкапсуляции определения запроса. В случае с OP он будет встроен и так же, как просто делает SELECT Column1, Column2, Column3 FROM SomeTable
. Большую часть времени они не материализуются заранее, поэтому они не возвращают строк WITH T(X) AS (SELECT NEWID())SELECT * FROM T T1 JOIN T T2 ON T1.X=T2.X
, а также проверяют планы выполнения. Хотя иногда можно взломать план, чтобы получить катушку. Есть пункт подключения, запрашивающий подсказку для этого. - Мартин Смит 15 февраля '12 в 17:08
Оригинальный ответ
КТР
Узнайте больше на MSDN
CTE создает таблицу, используемую в памяти, но она действительна только для конкретного запроса, следующего за ним. При использовании рекурсии это может быть эффективной структурой.
Вы также можете рассмотреть возможность использования табличной переменной. Это используется как временная таблица и может использоваться несколько раз без необходимости повторной материализации для каждого соединения. Кроме того, если вам нужно сохранить несколько записей сейчас, добавить еще несколько записей после следующего выбора, добавить еще несколько записей после другой операции, а затем вернуть только те несколько записей, тогда это может быть удобной структурой, поскольку не нужно бросать после казни. В основном просто синтаксический сахар. Однако, если вы сохраняете низкое количество строк, оно никогда не материализуется на диск. См. В чем разница между временной таблицей и табличной переменной в SQL Server? Больше подробностей.
Temp Table
Узнайте больше на MSDN - прокрутите около 40% пути
Временная таблица - это буквально таблица, созданная на диске, только в определенной базе данных, которую, как все знают, можно удалить. Хороший разработчик несет ответственность за уничтожение этих таблиц, когда они больше не нужны, но администратор базы данных также может их стереть.
Временные таблицы бывают двух видов: локальные и глобальные. В терминах MS Sql Server вы используете #tableName
обозначение для локального и ##tableName
обозначение для глобального (обратите внимание на использование одинарного или двойного # в качестве идентифицирующей характеристики).
Обратите внимание, что с временными таблицами, в отличие от табличных переменных или CTE, вы можете применять индексы и т. П., Поскольку они являются законными таблицами в обычном смысле этого слова.
Обычно я использовал бы временные таблицы для более длинных или больших запросов, а также CTE или переменные таблиц, если бы у меня уже был небольшой набор данных, и я хотел просто быстро написать небольшой код для чего-то небольшого. Опыт и советы других указывают на то, что вы должны использовать CTE, в которых у вас есть небольшое количество строк, возвращаемых из него. Если у вас большое число, вы, вероятно, выиграете от возможности индексировать временную таблицу.