Ich habe eine Tabelle mit ein paar Dutzend Zeilen. Es folgt eine vereinfachte Einrichtung
CREATE TABLE #data ([Id] int, [Status] int);
INSERT INTO #data
VALUES (100, 1), (101, 2), (102, 3), (103, 2);
Und ich habe eine Abfrage, die diese Tabelle mit einer Reihe von Tabellenwert-erstellten Zeilen (bestehend aus Variablen und Konstanten) wie verknüpft
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];
Der Ausführungsplan für Abfragen zeigt, dass das Optimierungsprogramm eine FULL LOOP JOIN
Strategie verwendet, die angemessen erscheint, da beide Eingaben nur sehr wenige Zeilen enthalten. Eine Sache, die mir aufgefallen ist (und der ich nicht zustimmen kann), ist, dass TVC-Zeilen gespoolt werden (siehe Bereich des Ausführungsplans im roten Feld).
Warum führt der Optimierer hier die Spool ein, was ist der Grund dafür? Hinter der Spule steckt nichts Komplexes. Sieht aus wie es nicht notwendig ist. Wie kann man es in diesem Fall loswerden, was sind die möglichen Wege?
Der obige Plan wurde am erhalten
Microsoft SQL Server 2014 (SP2-CU11) (KB4077063) - 12.0.5579.0 (X64)