2013-05-22 3 views
12

я мог либо сделатьSQL Server с пунктом против временной таблицы

select * into #randomTenUsers from 
(select top 10 * from users)x  

select * from #randomTenUsers 

ИЛИ

WITH randomTenUsers as (select top 10 * from users)  

select * from randomTenUsers 

Из того, что я понимаю, с заявлением также создает временный набор результатов.

Есть ли причина, по которой С С должно быть предпочтительнее, чем временные таблицы или наоборот?

+7

Нет жесткого правила относительно того, когда CTE (WITH) лучше или работает лучше, чем временная таблица. Если вам нужно иметь данные для нескольких операторов ->, тогда вам нужна временная таблица, так как CTE существует только для следующего оператора. С другой стороны, использование CTE намного проще и менее громоздко, чем создавать, заполнять, манипулировать и, в конечном счете, отбрасывать временную таблицу. Итак, в конце: ** это зависит ** от вашей конкретной ситуации; если оба подхода могут выполнить эту работу, я бы сначала пошел с CTE, но если это критично для производительности, также проверите таблицу temp и возьмите выбор –

+0

У нас был экземпляр, где использование CTE дало нам значительно худшие результаты чем использование временной таблицы. Всегда стоит попробовать оба, если ваш запрос работает с большим количеством данных (более нескольких тысяч строк). По-видимому, это может быть связано с тем, что SQL Server не сохраняет статистику (например, количество строк) для CTE, но это делает для временных таблиц. Это может привести к субоптимальным планам выполнения. – NickG

ответ

17

Из того, что я понимаю, оператор WITH также создает временный результат set.

Нет, это не так. Использование CTE не создаст «временный результирующий набор». Могут быть причины для запроса для создания рабочих таблиц, но только потому, что вы используете CTE, не является одним из них.

Эти два запроса имеют идентичный план запросов, и ни один из них не создает временный результат, например, временную таблицу в tempdb.


with randomTenUsers as 
(
    select top 10 * 
    from users 
)  
select * 
from randomTenUsers; 

select * 
from (
    select top 10 * 
    from users 
    ) x; 

Как marc_s said in the comment, что вы должны использовать, зависит от того, что вы хотите сделать. Бывают ситуации, когда создание временной таблицы имеет смысл и есть ситуации, когда это совершенно необязательно.

+0

Итак, я собираю инструкции WITH в основном для улучшения читаемости кода. – Foo

+2

@Foo его можно использовать повторно в большем количестве мест, чем в запросе. Он также может быть повторно использован внутри него для создания рекурсивного запроса. –

Смежные вопросы