По-видимому, есть два способа создать временную таблицу в SQL-Server:
С табличной переменной ( табличной переменной )
DECLARE @tmp TABLE (Col1 INT, Col2 INT)
или с временной таблицей ( temporable table )
CREATE TABLE #tmp (Col1 INT, Col2 INT)
В чем разница между ними?
Исходный вопрос: в чем разница между временной таблицей и табличной переменной в SQL Server?
Существуют некоторые различия между временными таблицами (#tmp) и переменными (@tmp), хотя использование tempdb не является одним из них, как обсуждается в ссылке MSDN ниже.
Как правило, для малых и средних объемов данных и простых сценариев использования следует использовать табличные переменные. (Это слишком широкое руководство, конечно, множество исключений - см. Ниже и последующие статьи.)
Некоторые моменты, которые следует учитывать при выборе между ними:
Некоторое дальнейшее чтение:
Отличный ответ от Мартина Смита на dba.stackexchange.com
Часто задаваемые вопросы MSDN о разнице между ними: http://support.microsoft.com/default.aspx/kb/305977
Статья в блоге 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#
Поскольку в версии SQL SERVER 2008 используются переменные типа TABLE, они действительны только во время выполнения блока кода.
Эти таблицы создаются в базе данных tempdb в папке Temporary Tables. если мы закроем текущее соединение, эта таблица будет удалена.
Табличные переменные действительны только в течение короткого времени, только во время выполнения блока кода.
Существуют локальные и глобальные временные таблицы , которые действуют только во время соединения или соединений, которые были открыты.
На практике, после проб и ошибок, чтобы получить большую скорость, на общем уровне вам следует:
Используйте таблицы переменных,
@tabla
когда данных несколько столбцов и строк, например. Максимум. 10 столбцов и менее 10 000 записей, и вам не нужно вносить изменения (update
,delete
,insert
) в таблицу. Помните, что он хранится в оперативной памяти, поэтому будет зависеть от вашего сервера.Используйте временные таблицы
#tabla
или##tabla
(глобальные, то есть во всех сессиях), когда у вас тысячи записей и/или нужно обновить данные в таблице. Иногда при его создании, если у вас более 10 000 строк, очень эффективно создать первичный индексPK
и/или оптимизированный индекс для запроса к данным.Попробуйте оба варианта и измерьте производительность, в зависимости от случая она даст вам более эффективный для вашего конкретного случая ответ, относительно легко изменить результат с a
select into @mitabla
наselect into #mitabla
.Из скромного мнения в профессиональной практике, в надежде, что это поможет вам...
1) С таблицей в качестве переменной и объемом данных в 20 000 записей мой
temdb
=> начал раздуватьсяDECLARE @vCodigos TABLE (Codigo1 varchar(50), Codigo2 varchar(50))
2) Использование временной таблицы с такими же записями меня начало раздувать,
temdb
хотя и в меньшей степени3) а при использовании СО было намного лучше и эффективнее, не влияя на
tempdb
=>WITH tblCodigos AS (SELECT A.codigo AS Codigo1, B.codigo2)