Mam stół z kilkadziesiąt rzędami. Poniżej przedstawiono uproszczoną konfigurację
CREATE TABLE #data ([Id] int, [Status] int);
INSERT INTO #data
VALUES (100, 1), (101, 2), (102, 3), (103, 2);
Mam zapytanie, które łączy tę tabelę z zestawem wierszy zbudowanych z wartości tabeli (wykonanych ze zmiennych i stałych)
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];
Plan wykonania zapytania pokazuje, że decyzja optymalizatora polega na zastosowaniu FULL LOOP JOIN
strategii, co wydaje się właściwe, ponieważ oba dane wejściowe mają bardzo mało wierszy. Zauważyłem jednak (i nie mogę się zgodzić), że wiersze TVC są buforowane (patrz obszar planu wykonania w czerwonym polu).
Dlaczego optymalizator wprowadza tutaj szpulę, jaki jest tego powód? Poza szpulą nie ma nic skomplikowanego. Wygląda na to, że nie jest to konieczne. Jak się go pozbyć w tym przypadku, jakie są możliwe sposoby?
Powyższy plan uzyskano dnia
Microsoft SQL Server 2014 (SP2-CU11) (KB4077063) - 12.0.5579.0 (X64)