2010-11-04 5 views
4

В чем разница между двумя типами временных таблиц @tmp vs #tmp в SQL 2005? и являются ли они их другими типами, о которых я не знаю?sql temp tables @tmp vs #tmp

благодарит

+1

Вы уже отмечали ответ, но, пожалуйста, проверьте другие ответы, так вы не останетесь с ложными впечатлениями о том, как SQL-сервер хранит временные данные. – ulty4life

ответ

9

#tmp является временным столом и действует как настоящий стол в основном. Он может иметь индексы, иметь статистику, участвовать в транзакциях, оптимизатор будет выработать правильные оценки строк

@tmp - это переменная таблицы. Нет индексов, нет статистики, а не транзакции, оптимизатор всегда принимает ровно 1 строку

В противном случае они оба ограничены (немного отличаются) в памяти/кеше, но контекст темпдб, однако, будет разливаться на диск, если слишком большой и т. Д.

Редактировать:

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

Кроме того, только что прочитал эту прочитанной What a difference a temp table makes over a table variable

Первое, что я был поставлен первичный ключ переменной @ComputersToProcess таблицы. Это превратило сканирование таблицы в кластерное сканирование индексов, но ничего не делало для производительности.

+0

Вы можете объявить переменную таблицы @tmp с кластеризованным индексом, но вы не можете добавлять какие-либо некластеризованные индексы (или ALTER it later) – BradC

+0

@BradC: он не отличается от того, как его использовали, хотя из-за отсутствия статистики ... – gbn

+0

У него может не быть статистики, но я не уверен, что это еще не изменило ситуацию. См. Http://msdn.microsoft.com/en-us/library/aa175774(SQL.80).aspx – BradC

1

@tmp относится к переменной типа таблицы, сохраненной в памяти, тогда как #tmp относится к таблице в базе данных TEMP.

0

Существует еще один тип «таблицы темпа». Я использую CTE, это похоже на создание временной таблицы.

2

Просто добавление к существующим ответам. На самом деле есть типы временных таблиц. В дополнение к другим ответам вы можете создавать глобальные временные таблицы, например, так: ##globalTempTable

Это видно для всех подключений к серверу sql и редко используются, однако полезно отметить, что они действительно существуют.

Вот хорошо читать на разнице между стандартными и глобальными временными таблицами http://www.codeproject.com/KB/database/TempTable.aspx

5

См http://support.microsoft.com/kb/305977:

Табличных переменными имеют следующие преимущества по сравнению с временными таблицами:

  • Как упомянуто Электронная документация по SQL Server «Таблицы», Табличные переменные, такие как локальные переменные, имеют четко определенные ed scope, в конце которого они автоматически очищаются.
  • Табличные переменные приводят к меньшему количеству повторных компиляции хранимой процедуры по сравнению с временными таблицами.
  • Операции, в которых используются переменные таблицы, сохраняются только на время обновления переменной таблицы. Поэтому переменные таблицы требуют меньше ресурсов блокировки и регистрации. Поскольку переменные таблицы имеют ограниченную область действия и не являются частью постоянной базы данных, транзакционные откаты не влияют на них.

Вот некоторые из недостатков по сравнению с временными таблицами:

  • некластерированных индексы не могут быть созданы на стол переменных, отличных от системы показателей, которые создаются для первичного или уникального ограничение. Это может повлиять на производительность запроса по сравнению с временной таблицей с некластеризованными индексами.
  • Таблица переменных не поддерживает статистику как временные таблицы. Статистика не может быть создана в переменных таблицы посредством автоматического создания или с помощью инструкции CREATE STATISTICS. Поэтому для сложных запросов на больших таблицах отсутствие статистики может помешать оптимизатору определить наилучший план запроса, что повлияет на производительность этого запроса.
  • Определение таблицы не может быть изменено после первоначальной инструкции DECLARE.
  • Переменные таблиц не могут использоваться в инструкции INSERT EXEC или SELECT INTO.
  • Ограничения CHECK, значения DEFAULT и вычисленные столбцы в объявлении типа таблицы не могут вызывать пользовательские функции.
  • Вы не можете использовать инструкцию EXEC или хранимую процедуру sp_executesql для запуска динамического запроса SQL Server, который ссылается на переменную таблицы, если переменная таблицы была создана вне инструкции EXEC или хранимой процедуры sp_executesql. Поскольку таблицы переменных можно ссылаться только в их локальной области, инструкция EXEC и хранимая процедура sp_executesql будут выходить за пределы переменной таблицы. Однако вы можете создать переменную таблицы и выполнить всю обработку внутри инструкции EXEC или хранимой процедуры sp_executesql, потому что локальная область переменных таблицы находится в инструкции EXEC или хранимой процедуре sp_executesql.

Существуют ли таблицы переменных структуры только для памяти, которые гарантируют лучшую производительность по сравнению с временными или постоянными таблицами, потому что они поддерживаются в базе данных, которая находится на физическом диске?

  • Табличная переменная не является структурой памяти. Поскольку переменная таблицы может содержать больше данных, чем может поместиться в память, она должна иметь место на диске для хранения данных. Табличные переменные создаются в базе данных tempdb, аналогичной временным таблицам. Если доступная память доступна, в таблице (кеше данных) создаются и обрабатываются как переменные таблицы, так и временные таблицы.

Для практического сравнения производительности, смотри также:

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