Eu tenho uma mesa com algumas dezenas de linhas. A configuração simplificada está seguindo
CREATE TABLE #data ([Id] int, [Status] int);
INSERT INTO #data
VALUES (100, 1), (101, 2), (102, 3), (103, 2);
E eu tenho uma consulta que une esta tabela a um conjunto de linhas construídas com valor de tabela (feitas de variáveis e constantes), como
DECLARE @id1 int = 101, @id2 int = 105;
SELECT
COALESCE(p.[Code], 'X') AS [Code],
COALESCE(d.[Status], 0) AS [Status]
FROM (VALUES
(@id1, 'A'),
(@id2, 'B')
) p([Id], [Code])
FULL JOIN #data d ON d.[Id] = p.[Id];
O plano de execução da consulta está mostrando que a decisão do otimizador é usar a FULL LOOP JOIN
estratégia, o que parece apropriado, pois as duas entradas têm muito poucas linhas. Uma coisa que notei (e não posso concordar), porém, é que as linhas do TVC estão sendo colocadas em spool (consulte a área do plano de execução na caixa vermelha).
Por que o otimizador apresenta o spool aqui, qual é o motivo para fazê-lo? Não há nada complexo além do carretel. Parece que não é necessário. Como se livrar dele, neste caso, quais são as formas possíveis?
O plano acima foi obtido em
Microsoft SQL Server 2014 (SP2-CU11) (KB4077063) - 12.0.5579.0 (X64)