Временные таблицы sql @tmp vs #tmp

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

Спасибо

5 ответов

Решение

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

@tmp переменная таблицы Без индексов, без статистики, без учета транзакций, оптимизатор всегда предполагает ровно 1 строку

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

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

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

Кроме того, просто прочитайте это. Прочитайте, какая разница между временной таблицей и табличной переменной

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

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

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

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

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

  • Некластеризованные индексы нельзя создавать для табличных переменных, кроме системных индексов, которые создаются для ограничения PRIMARY или UNIQUE. Это может повлиять на производительность запроса по сравнению с временной таблицей с некластеризованными индексами.
  • Табличные переменные не поддерживают статистику, как временные таблицы. Статистика не может быть создана для табличных переменных с помощью автоматического создания или с помощью оператора 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 аналогично временным таблицам. Если память доступна, переменные таблицы и временные таблицы создаются и обрабатываются в памяти (кэш данных).

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

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

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

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

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

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

Другие вопросы по тегам