Я нещодавно зіткнувся з цим питанням і не зміг знайти жодного обговорення цього питання в Інтернеті.
Запит нижче
DECLARE @S VARCHAR(1) = '';
WITH T
AS (SELECT name + @S AS name2,
*
FROM master..spt_values)
SELECT *
FROM T T1
INNER JOIN T T2
ON T1.name2 = T2.name2;
Завжди отримує вкладений план циклів

Спроба змусити проблему за допомогою INNER HASH JOINабо INNER MERGE JOINпідказки призводить до наступної помилки.
Процесор запиту не зміг скласти план запиту через підказки, визначені в цьому запиті. Повторно надішліть запит, не вказуючи жодних підказок і не використовуючи SET FORCEPLAN.
Я знайшов вирішення, яке дозволяє використовувати хеш або злиття приєднання - загортання змінної в сукупність. Генерований план значно нижчий затрати (19.2025 проти 0.261987)
DECLARE @S2 VARCHAR(1) = '';
WITH T
AS (SELECT name + (SELECT MAX(@S2)) AS name2,
*
FROM spt_values)
SELECT *
FROM T T1
INNER JOIN T T2
ON T1.name2 = T2.name2;

У чому причина такої поведінки? і чи є кращий шлях, ніж той, який я знайшов? (що, можливо, не вимагає додаткових гілок плану виконання)

