Ich bin kürzlich auf dieses Problem gestoßen und konnte online keine Diskussion darüber finden.
Die Abfrage unten
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;
Erhält immer einen verschachtelten Schleifenplan
Der Versuch, das Problem mit INNER HASH JOIN
oder INNER MERGE JOIN
Hinweise zu erzwingen, erzeugt den folgenden Fehler.
Der Abfrageprozessor konnte aufgrund der in dieser Abfrage definierten Hinweise keinen Abfrageplan erstellen. Senden Sie die Abfrage erneut, ohne Hinweise anzugeben und ohne SET FORCEPLAN zu verwenden.
Ich habe eine Problemumgehung gefunden, mit der Hash- oder Merge-Joins verwendet werden können - das Umschließen der Variablen in ein Aggregat. Der generierte Plan ist deutlich kostengünstiger (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;
Was ist der Grund für dieses Verhalten? und gibt es einen besseren Workaround als den, den ich gefunden habe? (das erfordert möglicherweise nicht die zusätzlichen Ausführungsplanverzweigungen)
quelle