Este artigo é um artigo espelhado de tradução automática, por favor clique aqui para ir para o artigo original.

Vista: 11952|Resposta: 0

[Fonte] Explicação detalhada de tabelas temporárias em bancos de dados SQL Server

[Copiar link]
Publicado em 28/05/2020 10:52:28 | | | |
Tabelas temporárias são muito importantes no banco de dados SQLSERVER, e a seguir está uma introdução detalhada às características e ao uso de tabelas temporárias no banco de dados SQL, apenas para referência.

Tabelas temporárias são semelhantes às tabelas persistentes, mas tabelas temporárias são armazenadas no tempdb e são automaticamente excluídas quando não estão mais em uso. Existem dois tipos de tabelas temporárias: local e global. Eles são distinguidos pelo nome, visibilidade e disponibilidade.

A tabela temporária possui as seguintes características:

  • Tabelas temporárias locais são tabelas que os usuários adicionam o prefixo "#" ao criar tabelas, que são independentes de acordo com as conexões do banco de dados. Apenas a conexão do banco de dados que criou a tabela temporária local tem acesso à tabela, e outras conexões não podem acessá-la.
  • Em diferentes conexões de banco de dados, embora as tabelas temporárias locais criadas tenham o mesmo "nome", essas tabelas não têm relação entre si. No SQLSERVER, um mecanismo especial de nomenclatura garante a independência das tabelas temporárias locais nas conexões de banco de dados.
  • Tabelas temporárias verdadeiras aproveitam o espaço temporário do banco de dados, que é mantido automaticamente pelo sistema de banco de dados, economizando assim espaço nas tabelas. E como o espaço de tabela temporário geralmente usa memória virtual, o número de E/S no disco rígido é muito reduzido, então a eficiência do sistema também é melhorada.
  • A tabela temporária é esvaziada automaticamente após o término da transação ou sessão, então você não precisa lembrar de deletar os dados depois que eles acabam.


Tabelas temporárias locais

O nome da tabela temporária local é prefixado por um único símbolo numérico (#); Eles são visíveis apenas para a conexão do usuário atual (ou seja, a conexão que cria a tabela temporária local); Ele é excluído quando um usuário se desconecta de uma instância do SQL Server.

Por exemplo, criamos uma tabela temporária local em uma conexão de banco de dados com a seguinte instrução: #Temp

Conexão com o Banco de Dados 1:



Depois, inicie a conexão de banco de dados 2 ao mesmo tempo para realizar a consulta #temp

Conexão com o Banco de Dados 2:



Vamos ver qual é o resultado da conexão de banco de dados 2?

Conexão com o Banco de Dados 2:



Os resultados mostram que a conexão de banco de dados 2 não consegue encontrar a tabela #Temp. Isso significa que a #Temp temporária da tabela só é visível para a conexão de banco de dados 1 que a criou, mas não para a conexão de banco de dados 2.

Tabela temporária global

O nome de uma tabela temporária global é precedido por dois símbolos numéricos (##) e é visível para quaisquer conexões de banco de dados quando criadas, sendo removido quando todas as conexões de banco de dados que fazem referência à tabela são desconectadas do SQL Server.

Por exemplo, criamos uma tabela temporária global ##Temp em uma conexão de banco de dados com a seguinte instrução e então inserimos três linhas de dados

Conexão com o Banco de Dados 1:



Depois, consultamos o ##Temp的数据 na conexão de banco de dados 2

Conexão com o Banco de Dados 2:



O resultado da conexão de banco de dados 2 é o seguinte

Conexão com o Banco de Dados 2:



Como você pode ver, a conexão de banco de dados 2 pode acessar com sucesso a tabela temporária global ##Temp criada pela conexão de banco de dados 1, mas se fecharmos a conexão de dados 1 agora e executar o ##Temp查询语句会发生什么呢 da conexão de banco de dados 2? Os resultados são os seguintes:

Feche a conexão 1 do banco de dados, e então a conexão 2 executa novamente:



Descobrimos que, após fechar a conexão 1 do banco de dados, a conexão 2 não consegue encontrar a tabela temporária global ##Temp了. Isso porque, após o fechamento da conexão 1 do banco de dados, não há nenhuma instrução na conexão 2 usando a tabela temporária ##Temp, então o sqlserver pensa que não há conexão de banco de dados referenciando a tabela temporária global ##Temp了 neste momento, então ele fará ##Temp释放掉了.


Em seguida, tentamos fechar a tabela temporária global ##Temp持有事务中的排他锁 (X-lock) na conexão 2 do banco de dados e depois fechar a conexão 1.

Conexão com o Banco de Dados 1:



Conexão com o Banco de Dados 2:



Feche a conexão 1 do banco de dados, e então a conexão 2 executa:



O resultado mostra que, embora fedemos a conexão 1 do banco de dados, porque a conexão 2 tem mantido a tabela temporária global ##Temp的排他锁 (bloqueio X) na transação, a tabela temporária # #Temp并没有随着数据库连接1的关闭而被释放掉, desde que a transação iniciada na conexão 2 do banco de dados não seja revertida ou confirmada, a conexão 2 sempre manterá a tabela temporária ##Temp的排他锁. Neste momento, o Sqlserver vai achar que ainda existe uma conexão de banco de dados referenciando a tabela temporária global ##Temp, então ##Temp不会被释放掉.




Anterior:Acesso de propriedade TypeScript (set,get)
Próximo:SQL Server consulta os dias anteriores do horário atual do sistema
Disclaimer:
Todo software, material de programação ou artigos publicados pela Code Farmer Network são apenas para fins de aprendizado e pesquisa; O conteúdo acima não deve ser usado para fins comerciais ou ilegais, caso contrário, os usuários terão todas as consequências. As informações deste site vêm da Internet, e disputas de direitos autorais não têm nada a ver com este site. Você deve deletar completamente o conteúdo acima do seu computador em até 24 horas após o download. Se você gosta do programa, por favor, apoie um software genuíno, compre o registro e obtenha serviços genuínos melhores. Se houver qualquer infração, por favor, entre em contato conosco por e-mail.

Mail To:help@itsvse.com