Ho un tavolo con poche dozzine di righe. Segue una configurazione semplificata
CREATE TABLE #data ([Id] int, [Status] int);
INSERT INTO #data
VALUES (100, 1), (101, 2), (102, 3), (103, 2);
E ho una query che unisce questa tabella a un set di righe costruite con valori di tabella (fatte di variabili e costanti), come
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];
Il piano di esecuzione della query sta dimostrando che la decisione dell'ottimizzatore è quella di utilizzare la FULL LOOP JOIN
strategia, il che sembra appropriato, poiché entrambi gli input hanno pochissime righe. Una cosa che ho notato (e non posso essere d'accordo), tuttavia, è che le righe TVC sono in fase di spool (vedere l'area del piano di esecuzione nella casella rossa).
Perché Optimizer introduce la spool qui, qual è il motivo per farlo? Non c'è nulla di complesso oltre la bobina. Sembra che non sia necessario. Come sbarazzarsene in questo caso, quali sono i modi possibili?
Il piano di cui sopra è stato ottenuto il
Microsoft SQL Server 2014 (SP2-CU11) (KB4077063) - 12.0.5579.0 (X64)