В чем разница между:
CREATE TABLE #temp ( [ID] INT)
INSERT INTO #temp
SELECT ...
а также
DECLARE @temp TABLE ( [ID] INT)
INSERT @temp
SELECT ...
в SQL Server 2008?
В чем разница между:
CREATE TABLE #temp ( [ID] INT)
INSERT INTO #temp
SELECT ...
а также
DECLARE @temp TABLE ( [ID] INT)
INSERT @temp
SELECT ...
в SQL Server 2008?
Временные таблицы похожи на обычные таблицы по большинству характеристик, за исключением того, что они входят в TempDB вместо текущей базы данных, и они исчезают после ограниченной области (в зависимости от того, являются ли они глобальными временными таблицами на основе сеанса или являются глобальными. Но все изменения данных в временных таблицах являются регистрируется в журнале транзакций, со всеми вытекающими отсюда последствиями для производительности. otoh, вы также можете добавить во временную таблицу столько же индексов, или представлений, ни триггеров, ни чего еще вы хотите, точно так же, как и в обычную таблицу.
Табличные переменные - это своего рода сокращенная таблица в памяти (они также используют временную базу данных). Изменения в них не регистрируются (это повышает производительность). Но вы можете получить для них только один индекс (поскольку индексы не могут быть созданы после оператора начального объявления, единственный индекс, который вы можете создать для табличной переменной, - это тот, который может быть включен в начальное объявление переменной таблицы ...
Declare @Tab Table (myKey integer Primary Key Not Null, data varchar(20))
Из-за этих характеристик временные таблицы лучше подходят для больших таблиц (широких и с большим количеством строк) и / или которые будут подвергаться более чем одному шаблону доступа в течение их срока службы, в то время как переменные таблицы лучше всего подходят, когда вам нужна очень узкая таблица ( только таблица ключей или ключ только с одним столбцом данных), к которому всегда будет обращаться этот индексированный ключ ...
UNIQUE
s: DECLARE @T TABLE (ID1 INTEGER NOT NULL UNIQUE, ID2 INTEGER NOT NULL UNIQUE);
так что это наверняка создаст два индекса, не так ли?
- person onedaywhen; 22.02.2012
@table_variables
регистрируются.
- person Martin Smith; 12.04.2012
Это довольно хороший справочник по различным временным таблицам.
Временные таблицы и переменные < / а>
Дополнительные сведения см. В этой теме.
Табличные переменные имеют четко определенную область видимости. Они будут автоматически очищены в конце пакета (то есть текущего пакета операторов), тогда как временная таблица будет видна для текущего сеанса и вложенных хранимых процедур. Глобальная временная таблица будет видна всем сессиям.
Табличные переменные создаются с помощью оператора Declare. Мы не можем создать табличную переменную с помощью оператора
select * into @tableVariableName
Но мы можем создать временную таблицу, используя оператор Create table, а также оператор
select * into #tempTableName
Начиная с SQL Server 2008, мы можем передавать табличную переменную в качестве параметра хранимым процедурам. Но мы не можем передать временную таблицу в качестве параметра хранимой процедуре.
Мы можем использовать табличную переменную внутри UDF (пользовательская функция), но мы не можем использовать временную таблицу внутри UDF.