Estou com o seguinte problema no SQL Server 2005: tentar inserir algumas linhas em uma variável de 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 de 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 select é a mesma entre as 2 consultas e o número de resultados retornados pelo select é de aproximadamente 10.000 linhas. O tempo necessário para executar o select sozinho é de aproximadamente 10 segundos.
A versão da tabela temporária leva até 10 segundos para ser executada, tive que interromper a versão da variável da tabela após 5 minutos.
Tenho que usar uma variável de tabela porque a consulta faz parte de uma função de valor de tabela, que não permite acesso à tabela temporária.
Plano de execução para a versão variável da tabela
Plano de execução para a versão da tabela temporária
A diferença óbvia entre os dois planos é que o mais rápido é paralelo e o mais lento é serial.
Essa é uma das limitações dos planos que inserem nas variáveis da tabela. Conforme mencionado nos comentários (e parece que teve o efeito desejado), você pode tentar fazer
para ver se isso contorna a limitação.
As variáveis de tabela às vezes são mais lentas porque não há estatísticas nas variáveis de tabela e, portanto, o otimizador sempre assume apenas um registro.
No entanto, não posso garantir que este seja o caso aqui, você terá que dar uma olhada nas informações de "linhas estimadas" no plano de consulta para a variável de tabela.