В чем разница между TEMPORARY TABLE и TABLE VARIABLE в SQL 2008?

В чем разница между:

CREATE TABLE #temp ( [ID] INT)

INSERT INTO #temp
SELECT ...

а также

DECLARE @temp TABLE ( [ID] INT)

INSERT @temp
SELECT ...

в SQL Server 2008?


person abatishchev    schedule 20.10.2009    source источник
comment
comment
@Martin: Замечательный вопрос и особенно ответ. Спасибо!   -  person abatishchev    schedule 13.04.2012


Ответы (4)


Временные таблицы похожи на обычные таблицы по большинству характеристик, за исключением того, что они входят в TempDB вместо текущей базы данных, и они исчезают после ограниченной области (в зависимости от того, являются ли они глобальными временными таблицами на основе сеанса или являются глобальными. Но все изменения данных в временных таблицах являются регистрируется в журнале транзакций, со всеми вытекающими отсюда последствиями для производительности. otoh, вы также можете добавить во временную таблицу столько же индексов, или представлений, ни триггеров, ни чего еще вы хотите, точно так же, как и в обычную таблицу.

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

   Declare @Tab Table (myKey integer Primary Key Not Null, data varchar(20)) 

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

person Charles Bretana    schedule 20.10.2009
comment
Оптимизатор также предполагает, что табличная переменная всегда имеет ровно 1 строку. - person erikkallen; 21.10.2009
comment
@erikkallen, не знал этого; пожалуйста ссылку? - person Charles Bretana; 21.10.2009
comment
вы можете получить для них только один индекс (поскольку индексы не могут быть созданы после оператора начального объявления - как насчет случаев, когда оператор начального объявления включает более одной логической конструкции, которая, как известно, физически создает индекс, например, она содержит два UNIQUEs: DECLARE @T TABLE (ID1 INTEGER NOT NULL UNIQUE, ID2 INTEGER NOT NULL UNIQUE); так что это наверняка создаст два индекса, не так ли? - person onedaywhen; 22.02.2012
comment
Изменения в @table_variables регистрируются. - person Martin Smith; 12.04.2012

Это довольно хороший справочник по различным временным таблицам.

Временные таблицы и переменные < / а>

person CSharpAtl    schedule 20.10.2009

  1. Нет журнала для табличных переменных
  2. Табличные переменные имеют только локальную область видимости (вы не можете получить доступ к одной и той же табличной переменной из разных процедур)
  3. Процедуры с временными таблицами не могут быть предварительно скомпилированы

Дополнительные сведения см. В этой теме.

person Manu    schedule 20.10.2009

  1. Табличные переменные имеют четко определенную область видимости. Они будут автоматически очищены в конце пакета (то есть текущего пакета операторов), тогда как временная таблица будет видна для текущего сеанса и вложенных хранимых процедур. Глобальная временная таблица будет видна всем сессиям.

  2. Табличные переменные создаются с помощью оператора Declare. Мы не можем создать табличную переменную с помощью оператора

    select * into @tableVariableName
    

    Но мы можем создать временную таблицу, используя оператор Create table, а также оператор

    select * into #tempTableName
    
  3. Начиная с SQL Server 2008, мы можем передавать табличную переменную в качестве параметра хранимым процедурам. Но мы не можем передать временную таблицу в качестве параметра хранимой процедуре.

  4. Мы можем использовать табличную переменную внутри UDF (пользовательская функция), но мы не можем использовать временную таблицу внутри UDF.

person kuttychutty    schedule 28.03.2013