Existem algumas diferenças entre tabelas temporárias (#tmp) e variáveis de tabela (@tmp), embora o uso de tempdb não seja uma delas, conforme explicado no link do MSDN abaixo.
Como regra geral, para pequenos e médios volumes de dados e cenários de uso simples, você deve usar variáveis de tabela. (Esta é uma diretriz muito ampla com, claro, muitas exceções - veja abaixo e os artigos seguintes.)
Alguns pontos a serem considerados na hora de escolher entre eles:
-
Tabelas temporárias são tabelas reais para que você possa fazer coisas como CREATE INDEXes, etc. Se você tiver grandes quantidades de dados para os quais o acesso por índice será mais rápido, as tabelas temporárias são uma boa opção.
-
As variáveis de tabela podem ter índices usando restrições PRIMARY KEY ou UNIQUE. (Se você deseja um índice não exclusivo, basta incluir a coluna de chave primária como a última coluna na restrição exclusiva. Se você não tiver uma coluna exclusiva, poderá usar uma coluna de identidade.) O SQL 2014 também possui índices não exclusivos .
-
Variáveis de tabela não participam de transações eSELECT
s estão implicitamente comNOLOCK
. O comportamento da transação pode ser muito útil, por exemplo, se você quiser ROLLBACK no meio de um procedimento, as variáveis de tabela preenchidas durante essa transação ainda serão preenchidas!
-
As tabelas temporárias podem resultar na recompilação de procedimentos armazenados, talvez com frequência. As variáveis de tabela não.
-
Você pode criar uma tabela temporária usando SELECT INTO, que pode ser mais rápido de escrever (bom para consultas ad-hoc) e pode permitir que você lide com a alteração de tipos de dados ao longo do tempo, já que você não precisa definir sua estrutura de tabela temporária antecipadamente.
-
Você pode passar variáveis de tabela de volta de funções, permitindo encapsular e reutilizar lógica muito mais fácil (por exemplo, fazer uma função para dividir uma string em uma tabela de valores em algum delimitador arbitrário).
-
O uso de variáveis de tabela em funções definidas pelo usuário permite que essas funções sejam usadas mais amplamente (consulte a documentação CREATE FUNCTION para obter detalhes). Se você estiver escrevendo uma função, você deve usar variáveis de tabela sobre tabelas temporárias, a menos que haja uma necessidade convincente de outra forma.
-
As variáveis de tabela e as tabelas temporárias são armazenadas em tempdb. Mas as variáveis de tabela (desde 2005) são padronizadas para o agrupamento do banco de dados atual versus tabelas temporárias que usam o agrupamento padrão de tempdb (ref). Isso significa que você deve estar ciente dos problemas de agrupamento se estiver usando tabelas temporárias e seu agrupamento de banco de dados for diferente do tempdb, causando problemas se você quiser comparar dados na tabela temporária com dados em seu banco de dados.
-
Tabelas temporárias globais (##tmp) são outro tipo de tabela temporária disponível para todas as sessões e usuários.
Algumas leituras adicionais:
-
A ótima resposta de Martin Smith em dba.stackexchange.com
-
Perguntas frequentes do MSDN sobre a diferença entre os dois:https://support.microsoft.com/en-gb/kb/305977
-
Artigo do blog MDSN:https://docs.microsoft.com/archive/blogs/sqlserverstorageengine/tempdb-table-variable-vs-local-temporary-table
-
Artigo:https://searchsqlserver.techtarget.com/tip/Temporary-tables-in-SQL-Server-vs-table-variables
-
Comportamentos inesperados e implicações de desempenho de tabelas temporárias e variáveis temporárias:Paul White em SQLblog.com