CTE (Common Table Expression) против временных таблиц или табличных переменных, что быстрее? - PullRequest
11 голосов
/ 15 марта 2011

CTE (общее табличное выражение) против Temp tables или Table variables, что быстрее?

Ответы [ 3 ]

30 голосов
/ 15 марта 2011

Как я уже сказал в своем комментарии: ЭТО ЗАВИСИТ!

Это действительно зависит от вашего запроса, ваших данных (сколько там? Какой это тип ??) игораздо больше.

Следует помнить несколько пунктов:

  • CTE - это «встроенное представление», допустимое только для следующего оператора;если возможно, SQL Server сохранит временный результат в памяти

  • Temp Таблицы бывают двух видов: те, которые видны только вашему соединению (create table #temp), или те, которые видны глобальновсе соединения (create table ##temp);оба будут автоматически отброшены, когда их больше не использует соединение.Вы можете определить индексы для временных таблиц, и они являются частью транзакций

  • Переменные таблиц не позволяют создавать индексы для них и не участвуют в транзакционном танце - этоможет быть за или против - просто знайте об этом!ROLLBACK не влияет на данные, содержащиеся в табличной переменной ....

12 голосов
/ 08 ноября 2013

http://royalarun.blogspot.in/2013/10/difference-between-cte-and-temp-table.html

Разница между CTE и таблицей Temp и переменной таблицы в SQL Server

  1. Таблицы Temp физически создаются в Tempdbбаза данных.Эти таблицы действуют как обычные таблицы и также могут иметь ограничения, индексировать как обычные таблицы.Он разделен на две локальные временные таблицы и глобальную временную таблицу. Локальная временная таблица доступна только для сеанса или соединения SQL Server (имеется в виду один пользователь), который создал таблицы.Глобальные временные таблицы доступны для всех сеансов или соединений SQL Server (означает всех пользователей).Они могут быть созданы любым пользователем соединения с SQL Server, и они автоматически удаляются, когда все соединения с SQL Server были закрыты. Случаи, когда вам требуется поддержка отката транзакции.

  2. CTE - Общее выражение таблицыявляется именованным временным набором результатов, который используется для управления сложными данными подзапросов.Это существует для объема заявления.Это создается в памяти, а не в базе данных Tempdb.Вы не можете создать какой-либо индекс в CTE.

  3. Переменная таблицы действует как переменная и существует для определенного пакета выполнения запроса.Он сбрасывается автоматически, как только выходит из партии.Это также создается в базе данных Tempdb, но не в памяти. Вы не можете создать некластеризованный индекс для табличной переменной, если этот индекс не является побочным эффектом ограничения PRIMARY KEY или UNIQUE для таблицы.Если результирующий набор невелик, переменная таблицы всегда является оптимальным выбором.

7 голосов
/ 15 марта 2011

Мы получили 50% -ное увеличение скорости при переходе на CTE в одном конкретном случае, поэтому стоит попробовать, но любые улучшения, связанные с производительностью, должны быть отмечены, чтобы вы могли сравнить одно с другим.

PS: мы написали более одного запроса с CTE, прежде чем получили тот, который сейчас используем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...