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

Как кажется, есть два способа создавать временную таблицу в SQL-Server:

С переменной таблицы (table переменная)

DECLARE @tmp TABLE (Col1 INT, Col2 INT)

или с временной таблицей (temporary table)

CREATE TABLE #tmp (Col1 INT, Col2 INT)

Каково различие между ними?


Первоначальный вопрос: What's the difference between в temp table and table переменная in SQL Server?

10
задан 23.05.2017, 15:39
2 ответа

Существуют какие-то различия между временными подмостками (#tmp) и изменчивые (@tmp), хотя использование tempdb не один из них, как он выставляется в нижней ссылке MSDN.

Как правило, для маленьких и средних объемов данных и простых сцен использования ты должен использовать переменные таблицы. (Это слишком широкое правило конечно многие из исключений - см. ниже и после статей.)

Какие-то моменты, которые нужно считать в момент выбирания между ними:

  • Временные подмостки - в действительности подмостки, которым могут делаться такие вещи как ТЫ, ВЕРЬТЕ в то, Что Ты Индексировал, и т.д. Если ты манипулируешь большим количеством данных, для которого доступ через индекс будет быстрее, что временные, эти подмостки - хороший выбор.

  • У переменных таблицы могут быть индексы посредством использования ограничений PRIMARY KEY или UNIQUE. (Если ты хочешь не единственный индекс, достаточно включать колонну первичного ключа (primary key) как последняя колонна в единственное ограничение. Если у Вас нет единственной колонны, смоги использовать колонну тождества.) SQL 2014 содержит не единственные индексы также.

  • Переменные таблицы не участвуют в сделках, реестре или сбоя (logging or locking). Это значит, что они быстрее, так как они не требуют перегрузки, но наоборот не дают тебе эти характеристики. Так например, если он захочет реставрировать наполовину (ROLLBACK) через процедуру, тогда переменные таблицы, заселенные в течение этой сделки продолжат быть населенными!

  • Временные подмостки могли бы давать место пересоставленным Сторед Проседурес. Переменные таблицы не.

  • Ты можешь создавать временную таблицу используя SELECT INTO, который может быть быстрее, чтобы писать (хороший для ad-hoc консультации) и смоги позволять бороться с изменением типов данных через время, так как не необходимо определять структуру Вашей временной таблицы заранее.

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

  • Использование переменных таблицы внутри функций, определенных пользователем (user-defined functions) позволяет в те функции, которые используют более просторно (видеть документацию CREATE FUNCTION для большего количества деталей). Если ты пишешь функцию, ты должен использовать переменные таблицы на временных подмостках если только не будет настоятельной необходимости.

  • Обе переменные таблицы и временных подмостков хранятся в tempdb. Но переменные таблицы (с 2005) по умолчанию в "collation" настоящих баз данных по сравнению с временными подмостками, у которых есть предопределенный "collation" tempdb (ссылка). Это значит, что должны быть предотвращенными детали "Collation", если используются временные подмостки, и твой "collation" отличается в "collation" tempdb, вызывая проблемы, если он хочет сравнить данные во временной таблице с данными в базе данных.

  • Временные глобальные подмостки (## tmp) - другой тип временной таблицы, доступной для всех сеансов и пользователи.

Какое-то добавочное чтение:

Большой ответ Мартина Смита в dba.stackexchange.com

MSDN FAQ относительно различия между двумя: http://support.microsoft.com/default.aspx/kb/305977

статья в blog MDSN: http://blogs.msdn.com/sqlserverstorageengine/archive/2008/03/30/sql-server-table-variable-vs-local-temporary-table.aspx

Статья: http://searchsqlserver.techtarget.com/tip/0,289483,sid87_gci1267047,00.html#

10
ответ дан 01.12.2019, 08:17
  • 1
    если бы это не было много беспокойства, ты можешь прекращать помещать фразу " обновляя continua" в конце каждого actualizaci и # 243; n частичный. Просто s и # 237; guela издавая без какого-либо типа объявления – Carlos Muñoz 03.12.2015, 18:37
  • 2
    Просвет, что s и # 237; совершенный! – Jorgesys♦ 03.12.2015, 18:38
  • 3
    Но переменные назначенной по умолчанию таблицы в " collation" настоящих баз данных в comparaci и # 243; n с временными подмостками, у которых есть " collation" предопределенный tempdb . Эта фраза не понятна очень хорошо, кажется сказанной президентом Espa и # 241; в. и #191; Podr и # 237; схвати осветлять ее немного? – Konamiman 23.12.2015, 16:58
  • 4
    P и # 225; rrafo, что относится к использованию Collation , частично неправильно, так как переводится expresi и # 243; n " you should be aware" как " они должны быть предотвращенными detalles". Это неправильное, дело не в том, что должны были быть предотвращенными детали но нужно годиться atenci и # 243; n или быть осторожен, так как collation podr и # 237; чтобы отличаться между tempdb и базы данных. В pr и # 243; ximo комментарий моя подсказка для traducci и # 243; n. – Yaroslav 23.12.2015, 17:27
  • 5
    Они хранятся оба в tempdb. Но переменные таблицы (с 2005) используют по умолчанию " collation" настоящей базы данных, взамен временные подмостки используют " collation" предопределенный tempdb. Это значит, что нужно годиться atenci и # 243; n (иметь заботившийся / бывший в так) с возможными проблемами collation, если используются временные подмостки и " collation" использованный он отличается в ту tempdb, когда могут вызывать проблемы, если он хочет сравнить данные во временной таблице с данными в базе данных. – Yaroslav 23.12.2015, 17:28
DECLARE @tmp TABLE (Col1 INT, Col2 INT)

С версии SQL SERVER 2008, использует изменчивая тип ТАБЛИЦА, только они настоящие в течение выполнения блока кода.

CREATE TABLE #tmp (Col1 INT, Col2 INT)

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

Переменные тип таблица только настоящие в течение меньшего времени, только в течение блока кода в выполнении.

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

1
ответ дан 01.12.2019, 08:17

Теги

Похожие вопросы