Используют ли CTE пробелы в базе данных tempdb? - PullRequest
11 голосов
/ 18 октября 2011

Использует ли CTE какой-либо пробел в базе данных tempdb или он использует исключительно память?

Я пометил вопрос с mssql 2005 и 2008, так как использую оба.

Ответы [ 3 ]

11 голосов
/ 18 октября 2011

Я постараюсь не копировать / вставлять MSDN

Это не имеет значения.

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

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

Если CTE используется дважды или более, то этот код будет выполняться дважды или более. Он не будет выполнен один раз и кэширован в базе данных tempdb.

Резюме: может или не может, как если бы код был встроенным.

Примечание: рекурсивный CTE - это просто производная таблица внутри производной таблицы внутри производной таблицы внутри производной таблицы внутри der ... так же применимо.

Вы можете увидеть это в статье Тони Роджерсона . Использование tempdb произойдет в любом случае, если оно будет встроено. Он также отмечает, что использование временной таблицы может быть лучше из-за расширения «макро», которое я объяснил выше

К вашему сведению: то же самое относится и к представлениям. Просто макросы.

8 голосов
/ 18 октября 2011

Распространенное табличное выражение можно рассматривать как временный набор результатов. который определен в рамках выполнения одного SELECT, INSERT, Оператор UPDATE, DELETE или CREATE VIEW. Когда план запроса для В общем запросе табличного выражения для сохранения используется оператор спула По результатам промежуточного запроса компонент Database Engine создает рабочую таблицу в tempdb для поддержки этой операции.

источник

4 голосов
/ 18 октября 2011

Из MSDN: http://msdn.microsoft.com/en-us/library/ms345368.aspx

Распространенное табличное выражение можно рассматривать как временный набор результатов, определенный в области выполнения одного оператора SELECT, INSERT, UPDATE, DELETE или CREATE VIEW.

Когда план запроса для запроса общего табличного выражения использует оператор спула для сохранения промежуточных результатов запроса, компонент Database Engine создает рабочую таблицу в базе данных tempdb для поддержки этой операции.

...