Tabelas temporárias locais e globais no SQL Server

156

Qual é a diferença entre tabelas temporárias locais e globais no SQL Server?

andrew Sullivan
fonte
2
Aqui estão alguns detalhes resumidos sobre isso, Clique aqui
Jayesh Sorathia
5
Tenha cuidado ao usar variáveis ​​de tabela. Se você usá-los em uma consulta, eles podem causar sérios problemas de desempenho no seu plano de consulta, pois não são indexados.
Na verdade, as tabelas temporárias podem ser indexadas, se necessário, mas isso também leva tempo e recursos, por isso ainda pode causar problemas de desempenho ou recursos.
Andrew Steitz 12/09

Respostas:

114

Acho esta explicação bastante clara (é uma cópia pura da Technet ):

Existem dois tipos de tabelas temporárias: local e global. As tabelas temporárias locais são visíveis apenas para seus criadores durante a mesma conexão com uma instância do SQL Server como quando as tabelas foram criadas ou referenciadas pela primeira vez. As tabelas temporárias locais são excluídas depois que o usuário se desconecta da instância do SQL Server. As tabelas temporárias globais são visíveis para qualquer usuário e qualquer conexão após a criação e são excluídas quando todos os usuários que fazem referência à tabela se desconectam da instância do SQL Server.

Don
fonte
Ótima resposta útil! Eu estava procurando informações específicas sobre se / quando as tabelas temporárias globais foram automaticamente limpas pelo SQL Server.
kwill
Resposta muito clara e concisa. Alguém pode pensar em um bom caso de uso para tabelas temporárias globais? Um que ilustra seu objetivo em contraste com o objetivo das tabelas temporárias locais?
Trevor
336
  • As variáveis ​​de tabela ( DECLARE @t TABLE) são visíveis apenas para a conexão que a cria e são excluídas quando o lote ou procedimento armazenado termina.

  • As tabelas temporárias locais ( CREATE TABLE #t) são visíveis apenas para a conexão que a cria e são excluídas quando a conexão é fechada.

  • As tabelas temporárias globais ( CREATE TABLE ##t) são visíveis a todos e são excluídas quando todas as conexões que as referenciaram foram fechadas.

  • As tabelas permanentes do Tempdb ( USE tempdb CREATE TABLE t) são visíveis para todos e são excluídas quando o servidor é reiniciado.

Anthony Faull
fonte
55
Vale destacar também: as tabelas temporárias locais são excluídas quando o escopo que as criou é fechado. Portanto, se você criar uma tabela temporária local dentro de um sproc e tentar acessá-la fora desse sproc - ela não existirá.
+1 para Will. Eu estava tentando usar uma tabela temporária local como um otimizador e estava tentando usar um procedimento armazenado como um inicializador "crie e preencha se não existir". Como você diz, ele não funciona, a menos que você use uma tabela temporária global.
quillbreaker
9
"são excluídos quando todas as conexões que os referenciaram fecharam" - o que significa "que os referenciou" significa exatamente? Se um StoredProc de uma conexão nº 1 cria um ## TempTable, posso vê-lo em outra conexão nº 2, 10 minutos depois (se essa conexão nº 2 estava ativa no momento da criação da tabela?) RESPOSTA: As tabelas temporárias globais são descartadas automaticamente quando o A sessão que criou a tabela é encerrada e todas as outras tarefas pararam de fazer referência a elas. (veja mais nesta página, diferente resposta)
tbone
Tentei usar um procedimento armazenado para criar tabelas temporárias locais (#t) necessárias pela lógica subseqüente; no entanto, o procedimento armazenado pai precisou criá-las para que estivessem disponíveis para as chamadas de procedimento armazenado filhos. Isso foi uma coisa triste, porque temos vários procedimentos armazenados que precisam configurar as tabelas da mesma maneira e chamar em sprocs comuns. As tabelas temporárias globais funcionarão neste caso em que as chamadas filho terão acesso a tabelas criadas por um irmão? Estamos usando o SQL Server 2008.
Brandon
1
@Brandon Você está certo. Está faltando funcionalidade. O suporte do TSQL ao escopo adequado de dados transitórios é bastante superficial. É como se os designers de linguagem quisessem que tudo fosse global. E quase não há suporte para fechamentos. Você pode passar uma variável de cursor. Mas essa é outra lata de worms, porque linha por linha de agonia não é o caminho a seguir.
Anthony Faull 23/09/16
12

1.) Uma tabela temporária local existe apenas para a duração de uma conexão ou, se definida dentro de uma instrução composta, para a duração da instrução composta.

As tabelas temporárias locais estão disponíveis apenas para a sessão ou conexão do SQL Server (significa usuário único) que criou as tabelas. Eles são excluídos automaticamente quando a sessão que criou as tabelas foi fechada. O nome da tabela temporária local é marcado com um único sinal de hash ("#").

CREATE TABLE #LocalTemp
(
 UserID int,
 Name varchar(50), 
 Address varchar(150)
)
GO
insert into #LocalTemp values ( 1, 'Name','Address');
GO
Select * from #LocalTemp

O escopo da tabela temporária local existe para a sessão atual do usuário atual para a janela de consulta atual. Se você fechar a janela de consulta atual ou abrir uma nova janela de consulta e tentar encontrar a tabela temporária criada acima, isso fornecerá o erro.


2.) Uma tabela temporária global permanece permanentemente no banco de dados, mas as linhas existem apenas dentro de uma determinada conexão. Quando a conexão é fechada, os dados na tabela temporária global desaparecem. No entanto, a definição da tabela permanece no banco de dados para acesso quando o banco de dados for aberto na próxima vez.

As tabelas temporárias globais estão disponíveis para todas as sessões ou conexões do SQL Server (significa todo o usuário). Eles podem ser criados por qualquer usuário de conexão do SQL Server e excluídos automaticamente quando todas as conexões do SQL Server foram fechadas. O nome da tabela temporária global é marcado com um sinal de hash duplo ("##").

CREATE TABLE ##GlobalTemp
(
 UserID int,
 Name varchar(50), 
 Address varchar(150)
)
GO
insert into ##GlobalTemp values ( 1, 'Name','Address');
GO
Select * from ##GlobalTemp

As tabelas temporárias globais são visíveis para todas as conexões do SQL Server, enquanto as tabelas temporárias locais são visíveis apenas para a conexão atual do SQL Server.

Vivek S.
fonte
2
Sua definição de uma tabela temporária global é como eu esperaria que ela se comportasse (proveniente de outros bancos de dados), mas meus testes mostram que o que realmente acontece no SQL Server é: "As tabelas temporárias globais são descartadas automaticamente quando a sessão que criou a tabela extremidades e todas as outras tarefas pararam referenciá-los"
Nickolay
11

Citação de Manuais Online:

As tabelas temporárias locais são visíveis apenas na sessão atual; tabelas temporárias globais são visíveis para todas as sessões.

As tabelas temporárias são eliminadas automaticamente quando ficam fora do escopo, a menos que sejam explicitamente eliminadas usando DROP TABLE:

  • Uma tabela temporária local criada em um procedimento armazenado é descartada automaticamente quando o procedimento armazenado é concluído. A tabela pode ser referenciada por quaisquer procedimentos armazenados aninhados executados pelo procedimento armazenado que criou a tabela. A tabela não pode ser referenciada pelo processo que chamou o procedimento armazenado que criou a tabela.
  • Todas as outras tabelas temporárias locais são descartadas automaticamente no final da sessão atual.
  • As tabelas temporárias globais são descartadas automaticamente quando a sessão que criou a tabela termina e todas as outras tarefas param de fazer referência a elas. A associação entre uma tarefa e uma tabela é mantida apenas durante a vida útil de uma única instrução Transact-SQL. Isso significa que uma tabela temporária global é descartada na conclusão da última instrução Transact-SQL que fazia referência ativa à tabela quando a sessão de criação foi concluída.
Christian Hayter
fonte
0

Tabelas temporárias locais : se você criar tabelas temporárias locais, abrir outra conexão e tentar a consulta, receberá o seguinte erro.

as tabelas temporárias são acessíveis apenas dentro da sessão que as criou.

Tabelas temporárias globais : às vezes, convém criar uma tabela temporária acessível a outras conexões. Nesse caso, você pode usar tabelas temporárias globais.

As tabelas temporárias globais são destruídas apenas quando todas as sessões referentes a ela são fechadas.

Reza Jenabi
fonte
0

Vale ressaltar que também há: tabelas temporárias globais com escopo no banco de dados (atualmente suportadas apenas pelo Banco de Dados SQL do Azure).

As tabelas temporárias globais do SQL Server (iniciadas com ## table name) são armazenadas no tempdb e compartilhadas entre as sessões de todos os usuários em toda a instância do SQL Server.

O Banco de Dados SQL do Azure oferece suporte a tabelas temporárias globais que também são armazenadas no tempdb e com escopo definido no nível do banco de dados. Isso significa que as tabelas temporárias globais são compartilhadas para as sessões de todos os usuários no mesmo banco de dados SQL do Azure. As sessões do usuário de outros bancos de dados não podem acessar tabelas temporárias globais.

-- Session A creates a global temp table ##test in Azure SQL Database testdb1
-- and adds 1 row
CREATE TABLE ##test ( a int, b int);
INSERT INTO ##test values (1,1);

-- Session B connects to Azure SQL Database testdb1 
-- and can access table ##test created by session A
SELECT * FROM ##test
---Results
1,1

-- Session C connects to another database in Azure SQL Database testdb2 
-- and wants to access ##test created in testdb1.
-- This select fails due to the database scope for the global temp tables 
SELECT * FROM ##test
---Results
Msg 208, Level 16, State 0, Line 1
Invalid object name '##test'

ALTERAR A CONFIGURAÇÃO DO ESCOPO DA BASE DE DADOS

GLOBAL_TEMPORARY_TABLE_AUTODROP = { ON | OFF }

Aplica-se a: Banco de Dados SQL do Azure (o recurso está em visualização pública)

Permite definir a funcionalidade de descarte automático para tabelas temporárias globais. O padrão é ON, o que significa que as tabelas temporárias globais são eliminadas automaticamente quando não estão em uso por nenhuma sessão. Quando definida como OFF, as tabelas temporárias globais precisam ser eliminadas explicitamente usando uma instrução DROP TABLE ou serão automaticamente eliminadas na reinicialização do servidor.

Com os bancos de dados únicos do Azure SQL Database e os pools elásticos, essa opção pode ser definida nos bancos de dados de usuários individuais do servidor de Banco de Dados SQL. Na instância gerenciada do SQL Server e do Banco de Dados SQL do Azure, essa opção é definida no TempDB e a configuração dos bancos de dados de usuários individuais não tem efeito.

Lukasz Szozda
fonte
0

Não vi nenhuma resposta mostrar aos usuários onde podemos encontrar uma tabela Temp Global. Você pode visualizar as tabelas temporárias locais e globais no mesmo local ao navegar no SSMS. Captura de tela abaixo retirada deste link .

Bancos de Dados -> Bancos de Dados do Sistema -> tempdb -> Tabelas Temporárias

insira a descrição da imagem aqui

Code Novice
fonte