Eu tenho um procedimento armazenado que eu uso para carregar arquivos csv no SQL Server. Isso inicialmente inserirá o arquivo em massa em uma tabela temporária global e, no final, fará:
select cast(column1 as int) [column1], column2, column3... into table from ##temptable
e, em seguida, passa a soltar o##temptable
Antes da consulta select into table from ##temptable
, executo uma série de select
consultas na tabela temporária para determinar de que tipo as colunas devem ser (e estou confiante de que isso funciona corretamente).
Observe que ter uma tabela (normal ou temporária) antes de criar a tabela de saída final é essencial para o procedimento armazenado.
O que eu gostaria de saber é se é melhor usar uma tabela temporária global ou se devo usar uma tabela normal ou não faz diferença?
Eu vi vários artigos sobre as diferenças entre tabelas temporárias e variáveis de tabela, mas não vi nada quando se trata de comparar tabelas temporárias globais com tabelas normais e é difícil para mim testar isso corretamente no meu ambiente.
Uma tabela normal causará log em seu banco de dados, consumirá espaço e exigirá liberação de log em cada confirmação. Portanto, para dados temporários, você deve usar uma tabela temporária.
Mas você normalmente usaria uma tabela temporária regular (#) aqui, não uma tabela temporária global (##).
As tabelas temporárias globais são úteis no cenário (muito raro) em que várias sessões separadas precisam de acesso à mesma tabela temporária. Outro cenário em que uma tabela temporária global pode ser útil é quando a tabela temporária é criada em SQL dinâmico, mas referenciada no lote de chamada, por exemplo:
Mas uma tabela temporária global não é necessária para criar uma tabela temporária em um procedimento armazenado e acessá-la em SQL dinâmico, por exemplo:
E quando você cria uma tabela temporária regular em um procedimento armazenado, ela será destruída automaticamente quando o procedimento armazenado terminar e você poderá executar várias instâncias do mesmo procedimento sem interferir umas nas outras.
Existe algum benefício em potencialmente manter os dados disponíveis? Já vi casos em que, por exemplo, era útil preservar os dados na tabela de teste quando o
insert
declaração gerou um erro inesperado ou quando um sinalizador de depuração específico foi definido porque tornou muito mais fácil solucionar problemas e/ou reiniciar o processo sem recarregar o arquivo e esses benefícios valeram o custo de desacelerar a carga com registro adicional. Se você estiver fazendo um carregamento noturno do warehouse e carregar/processar/validar os dados na tabela de preparo leva, digamos, uma hora, pode valer a pena usar uma tabela permanente para preparar os dados. Você pode economizar de 10 a 15 minutos em um dia normal usando uma tabela temporária que não precisa gerar log, mas vale a pena se economizar horas de depuração e reexecução quando houver um problema.Se você não vai preservar os dados na tabela de teste, então eu concordo totalmente com David que você deveria usar uma tabela temporária (e provavelmente uma tabela temporária regular).