Я нещодавно зіткнувся з цим питанням і не зміг знайти жодного обговорення цього питання в Інтернеті.
Запит нижче
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;
У чому причина такої поведінки? і чи є кращий шлях, ніж той, який я знайшов? (що, можливо, не вимагає додаткових гілок плану виконання)