Birkaç düzine satır içeren bir masam var. Basitleştirilmiş kurulum takip ediyor
CREATE TABLE #data ([Id] int, [Status] int);
INSERT INTO #data
VALUES (100, 1), (101, 2), (102, 3), (103, 2);
Ve ben bu tabloyu tablo değeri oluşturulmuş satırlar (değişkenler ve sabitler yapılmış) bir dizi, gibi bir sorgu var
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];
Sorgu yürütme planı, FULL LOOP JOIN
her iki girdinin de çok az satırı olduğundan optimizasyon kararının uygun görünen stratejiyi kullanmak olduğunu gösteriyor . Fark ettiğim (ve kabul edemediğim) bir şey, TVC satırlarının biriktirilmesidir (kırmızı kutudaki yürütme planının alanına bakın).
Neden optimizer makarayı buraya getiriyor, bunu yapmanın nedeni nedir? Makaranın ötesinde karmaşık bir şey yoktur. Gerekli olmadığı anlaşılıyor. Bu durumda ondan nasıl kurtulur, olası yollar nelerdir?
Yukarıdaki plan
Microsoft SQL Server 2014 (SP2-CU11) (KB4077063) - 12.0.5579.0 (X64)