Son zamanlarda bu sorunla karşılaştım ve çevrimiçi olarak herhangi bir tartışma bulamadım.
Aşağıdaki sorgu
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;
Her zaman iç içe bir döngü planı alır
Sorunu INNER HASH JOIN
veya INNER MERGE JOIN
ipuçlarını zorlamaya çalışmak aşağıdaki hatayı üretir.
Sorgu işlemcisi, bu sorguda tanımlanan ipuçları nedeniyle bir sorgu planı üretemedi. Herhangi bir ipucu belirtmeden ve SET FORCEPLAN kullanmadan sorguyu yeniden gönderin.
Değişken bir toplama içinde sarma karma veya birleştirme birleşimleri kullanılmasına izin veren bir geçici çözüm buldum. Oluşturulan plan önemli ölçüde daha düşük maliyetlidir (19.2025 ve 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;
Bu davranışın nedeni nedir? ve bulduğumdan daha iyi bir çözüm var mı? (bu belki de ekstra icra planı dallarını gerektirmez)