Ostatnio natknąłem się na ten problem i nie mogłem znaleźć żadnej dyskusji na ten temat w Internecie.
Zapytanie poniżej
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;
Zawsze otrzymuje plan zagnieżdżonych pętli
Próbując wymusić problem z INNER HASH JOIN
lub INNER MERGE JOIN
podpowiedzi produkuje następujący błąd.
Procesor zapytań nie mógł wygenerować planu zapytania ze względu na wskazówki zdefiniowane w tym zapytaniu. Ponownie wprowadź zapytanie bez podawania wskazówek i bez użycia SET FORCEPLAN.
Znalazłem obejście, które pozwala na użycie sprzężenia mieszającego lub scalającego - zawijanie zmiennej w agregat. Wygenerowany plan jest znacznie tańszy (19,2025 vs 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;
Jaki jest powód tego zachowania? i czy istnieje lepsze obejście niż to, które znalazłem? (które być może nie wymagają dodatkowych oddziałów planu wykonania)
źródło