मैं हाल ही में इस मुद्दे पर आया था और ऑनलाइन इसकी कोई चर्चा नहीं कर पाया।
नीचे दिया गया प्रश्न
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;
इस व्यवहार का कारण क्या है? और क्या मैंने जो पाया उससे बेहतर वर्कअराउंड है? (कि शायद अतिरिक्त निष्पादन योजना शाखाओं की आवश्यकता नहीं है)