Recentemente, trabalhei em um procedimento armazenado muito lento (levou 5 minutos para ser executado). Fiz um pequeno ajuste ao fazer isso:
declare @tempTable table
(
...
)
insert into @tempTable
select .....
para
select ... into #tempTable from someTable
O script foi executado em aproximadamente 2 segundos. O que pode explicar essa diferença de horário?
As variáveis de tabela não têm estatísticas da mesma forma que as tabelas temporárias, normalmente elas são consideradas como tendo apenas 1 linha. Essa estimativa incorreta de contagem de linhas fará com que uma operação de loop aninhado pareça o melhor plano, mas quando isso é feito para uma quantidade maior de linhas, o custo pode ser maior do que uma varredura de tabela.
Apenas para adicionar à resposta de @MartinC que a contagem de linhas para variáveis de tabela é mantida
tempdb.sys.partitions
eOPTION(RECOMPILE)
pode fazer com que isso seja usado, mas não possui mais estatísticas granulares para usar, portanto, será necessário recorrer a suposições com base nisso.Você mostrou apenas o código de população em vez de qualquer código que o use. Outra limitação das consultas que inserem em variáveis de tabela é que elas não podem ter um plano paralelo para explicar por que a consulta de população pode ser executada mais rapidamente.
MartinC está correto, além disso, você também pode aplicar índices a tabelas temporárias. Isso não poderia ser feito com uma variável de tabela.