Saya punya meja dengan beberapa baris. Setup yang disederhanakan mengikuti
CREATE TABLE #data ([Id] int, [Status] int);
INSERT INTO #data
VALUES (100, 1), (101, 2), (102, 3), (103, 2);
Dan saya punya kueri yang menggabungkan tabel ini ke satu set nilai tabel yang dibangun baris (terbuat dari variabel dan konstanta), seperti
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];
Rencana pelaksanaan kueri menunjukkan bahwa keputusan pengoptimal adalah menggunakan FULL LOOP JOIN
strategi, yang tampaknya tepat, karena kedua input memiliki sangat sedikit baris. Satu hal yang saya perhatikan (dan tidak bisa setuju), adalah baris TVC sedang digulung (lihat area rencana eksekusi di kotak merah).
Mengapa optimizer memperkenalkan spool di sini, apa alasan untuk melakukannya? Tidak ada yang kompleks di luar gulungan. Sepertinya itu tidak perlu. Bagaimana cara menghilangkannya dalam hal ini, apa saja cara yang mungkin?
Rencana di atas diperoleh pada
Microsoft SQL Server 2014 (SP2-CU11) (KB4077063) - 12.0.5579.0 (X64)