У мене є таблиця з кількома десятками рядів. Спрощена установка наступна
CREATE TABLE #data ([Id] int, [Status] int);
INSERT INTO #data
VALUES (100, 1), (101, 2), (102, 3), (103, 2);
І у мене є запит, який приєднує цю таблицю до набору побудованих рядків зі значенням таблиці (з змінних та констант), наприклад
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];
План виконання запитів показує, що рішення оптимізатора полягає у використанні FULL LOOP JOIN
стратегії, яка видається доцільною, оскільки обидва входи мають дуже мало рядків. Одне, що я помітив (і не можу погодитись), - це те, що рядки TVC збираються в маску (див. Область плану виконання в червоному полі).
Чому оптимізатор вводить сюди золотник, в чому причина цього робити? Поза котушкою немає нічого складного. Схоже, це не потрібно. Як позбутися від цього в цьому випадку, які можливі способи?
Наведений вище план був отриманий на
Microsoft SQL Server 2014 (SP2-CU11) (KB4077063) - 12.0.5579.0 (X64)