Saya menemukan masalah ini baru - baru ini dan tidak dapat menemukan diskusi apa pun secara online.
Kueri di bawah ini
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;
Selalu mendapat paket loop bersarang
Mencoba memaksa masalah dengan INNER HASH JOIN
atau INNER MERGE JOIN
petunjuk menghasilkan kesalahan berikut.
Prosesor kueri tidak dapat menghasilkan rencana kueri karena petunjuk yang ditentukan dalam kueri ini. Kirim ulang kueri tanpa menentukan petunjuk apa pun dan tanpa menggunakan SET FORCEPLAN.
Saya menemukan solusi yang memungkinkan hash atau gabungan bergabung - membungkus variabel dalam agregat. Paket yang dihasilkan berbiaya lebih rendah secara signifikan (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;
Apa alasan perilaku ini? dan adakah solusi yang lebih baik daripada yang saya temukan? (yang mungkin tidak memerlukan cabang rencana eksekusi tambahan)
sumber