इस कनेक्ट आइटम में उदाहरण कोड
एक बग दिखाता है जहां
SELECT COUNT(*)
FROM dbo.my_splitter_1('2') L1
INNER JOIN dbo.my_splitter_1('') L2
ON L1.csv_item = L2.csv_item
सही परिणाम देता है। लेकिन निम्नलिखित गलत परिणाम देता है (2014 में नए कार्डिनैलिटी एस्टीमेटर का उपयोग करके)
SELECT
(SELECT COUNT(*)
FROM dbo.my_splitter_1('2') L1
INNER JOIN dbo.my_splitter_1('') L2
ON L1.csv_item = L2.csv_item)
चूंकि यह L2 के परिणामों को एक सामान्य उप अभिव्यक्ति स्पूल में गलत तरीके से लोड करता है, इसलिए L1 परिणाम के लिए इसके परिणाम को फिर से बताता है।
मैं इस बात को लेकर उत्सुक था कि दो प्रश्नों के बीच व्यवहार में अंतर क्यों है। ट्रेस फ्लैग 8675 से पता चलता है कि जो काम करता है वह प्रवेश करता है search(0) - transaction processing
और जो असफल होता है वह प्रवेश करता है search(1) - quick plan
।
इसलिए मैं मानता हूं कि व्यवहार में अंतर के पीछे अतिरिक्त परिवर्तन नियमों की उपलब्धता है (BuildGbApply या GenGbApplySimple को अक्षम करना उदाहरण के लिए इसे ठीक करना प्रतीत होता है)।
लेकिन इन समान प्रश्नों के लिए दो योजनाएं अलग-अलग अनुकूलन चरणों का सामना क्यों करती हैं? मैंने जो पढ़ा search (0)
है, उसके लिए कम से कम तीन तालिकाओं की आवश्यकता होती है और यह शर्त निश्चित रूप से पहले उदाहरण में नहीं मिलती है।