एक संयुक्त बल में नेस्टेड लूप्स में एक चर का संदर्भ क्यों देता है?


16

मैं हाल ही में इस मुद्दे पर आया था और ऑनलाइन इसकी कोई चर्चा नहीं कर पाया।

नीचे दिया गया प्रश्न

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; 

यहाँ छवि विवरण दर्ज करें

इस व्यवहार का कारण क्या है? और क्या मैंने जो पाया उससे बेहतर वर्कअराउंड है? (कि शायद अतिरिक्त निष्पादन योजना शाखाओं की आवश्यकता नहीं है)

जवाबों:


13

मैंने SQL 2012 के उदाहरण पर आपकी क्वेरी की कोशिश की है और समस्या को ठीक करने के लिए ध्वज 4199 का पता लगाता है। इसके सक्षम होने से मुझे 0.24 की कुल लागत और अतिरिक्त शाखाओं में से कोई भी एक मर्ज जॉइन नहीं मिला।

इस समस्या के लिए विशिष्ट KB आलेख प्रदर्शन समस्याएँ तब होती हैं जब आपकी क्वेरी में शामिल होने के लिए SQL Server 2005 या SQL Server 2008 में बाहरी संदर्भ स्तंभ होते हैं

यहाँ छवि विवरण दर्ज करें

आगे योग्यता प्राप्त करने के लिए, TF 4199 सभी ऑप्टिमाइज़र फ़िक्स को सक्षम करता है। देखें इस लिंक अधिक जानकारी के लिए। एक बार में सब कुछ सक्षम करने से अजीब दुष्प्रभाव हो सकते हैं, इसलिए यदि आप एक विशिष्ट फिक्स पा सकते हैं तो यह ठीक करने के लिए बेहतर हो सकता है कि यह अपने आप में सक्षम हो।

आप का उपयोग करके प्रति क्वेरी के आधार पर एक ट्रेस ध्वज को सक्षम कर सकते हैं OPTION (QUERYTRACEON 4199);


0

पुराना सवाल है, लेकिन जवाब को देखना सुपर निश्चित नहीं था, मुझे लगा कि मैं एक वर्कअराउंड पोस्ट करूंगा। यह सुनिश्चित नहीं है कि क्वेरी ऑप्टिमाइज़र पर क्यों HASH, लेकिन मुझे लगता है कि यह पसंद नहीं है MERGEक्योंकि इसमें इनपुट नहीं है। 2012/14 पर,

DECLARE @S VARCHAR(1) = '';

    WITH T
        AS (SELECT TOP (2147483647)
                name + @S AS name2,
                *
            FROM   master..spt_values
            ORDER BY name + @S)
    SELECT *
    FROM   T T1
           INNER JOIN T T2
             ON T1.name2 = T2.name2;

निम्नलिखित योजना तैयार करता है:

यहाँ छवि विवरण दर्ज करें

फोर्जिंग TOPऔर ORDER BYसीटीई में ऑप्टिमाइज़र को डेटासेट के बारे में पर्याप्त जानकारी देने के लिए लगता है MERGE JOIN

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.