Eu tenho o seguinte problema no SQL Server 2005: tentar inserir algumas linhas em uma variável da tabela leva muito tempo em comparação com a mesma inserção usando uma tabela temporária.
Este é o código para inserir na variável da tabela
DECLARE @Data TABLE(...)
INSERT INTO @DATA( ... )
SELECT ..
FROM ...
Este é o código para inserir na tabela temporária
CREATE #Data TABLE(...)
INSERT INTO #DATA( ... )
SELECT ..
FROM ...
DROP TABLE #Data
A tabela temporária não possui chaves ou índices, a parte de seleção é a mesma entre as 2 consultas e o número de resultados retornados pela seleção é de ~ 10000 linhas. O tempo necessário para executar a seleção sozinho é de ~ 10 segundos.
A versão da tabela temporária leva até 10 segundos para ser executada; tive que parar a versão da variável da tabela após 5 minutos.
Eu tenho que usar uma variável de tabela porque a consulta faz parte de uma função de valor da tabela, que não permite o acesso à tabela temporária.
Plano de execução para a versão da variável de tabela
Plano de execução para a versão da tabela temporária
EXEC
em uma função .... acho que estava erradoInvalid use of a side-effecting operator 'INSERT EXEC' within a function.
. AOPENQUERY
solução alternativa pode funcionar.Às vezes, as variáveis da tabela são mais lentas porque não há estatísticas nas variáveis da tabela e, portanto, o otimizador sempre assume apenas um registro.
No entanto, não posso garantir que esse seja o caso aqui, você deverá examinar as informações de "linhas estimadas" no plano de consulta da variável de tabela.
fonte