Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Qual é a diferença entre uma tabela temporária e uma variável de tabela no SQL Server?


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 e SELECT s estão implicitamente com NOLOCK . 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