इरविन: मैं इस विचार से सहमत होऊंगा कि कठोर आदेश देने के कारण, कई किनारे मामले पैदा हो सकते हैं जहां इष्टतम योजनाओं को खारिज किया जाएगा। मैंने हाल ही में किसी ऐसे व्यक्ति की मदद की जिसने अपनी क्वेरी में ऐसा कुछ किया है:
LEFT JOIN (
a
JOIN b ON a.id = b.a_id
JOIN c ON b.c_id = c.id
) ON a.id = something.a_id
LEFT JOIN (
table1 t1
JOIN table2 t2 ON t1.some_field = t2.other_field
JOIN talbe3 t3 ON t2.yafield = t3.something_else
) ON ....
repeat a few more times
उनके मामले में सबसे बुरा ये था कि ब्लॉक में से एक नेस्टेड लूप कुछ 200k पंक्तियों के माध्यम से जुड़ रहा था, लगभग 20k बार (गणित करें), और चूंकि कुंजियों को अनुक्रमित करने के लिए धक्का नहीं दिया जा सकता था, यह एक अनुक्रमिक स्कैन था। इसका मतलब था कि कैस्केडिंग योजना में बदलाव के कारण समग्र क्वेरी को चलने में लगभग 3 घंटे लगे। लेफ्ट जॉइन को डिस्ट्रीब्यूट करके, कीज़ को नीचे धकेला जा सकता है और कुछ सेकंड्स में क्वेरी चल जाती है। बेशक यह बिल्कुल समतुल्य नहीं है यही कारण है कि योजनाकार उन्हें समकक्ष नहीं मान सकता है और इसलिए यह उस योजना को एक हैश में शामिल होने और फिर एक नेस्टेड लूप के रूप में पता लगाने के लिए छोड़ दिया गया, जो दर्द से धीमा था।
जब भी आप किसी निश्चित क्रम से गुजरने के लिए जोर-जोर से जोड़ते हैं, तो आप उन मामलों को पेश करते हैं जहां योजना के निष्पादन में महत्वपूर्ण फ़िल्टर जानकारी अभी तक उपलब्ध नहीं हो सकती है, और इसलिए बाद में एक त्वरित सूचकांक स्कैन / हैश में शामिल होना संभव हो सकता है नेस्टेड लूप / अनुक्रमिक स्कैन में बहुत धीमी गति से किया जा सकता है और इसलिए जबकि उपरोक्त टुकड़ा तुरंत समकक्ष नहीं है, यह एक ही समस्या दिखाता है।
USING
यह थोड़ा तेज है - क्योंकि यह परिणाम मैट्रिक्स में एक कम स्तंभ में परिणाम है। आपके निष्कर्ष 2005 और 2008 के हैं। मुझे लगता है कि अब तक कोई भी समस्या तय नहीं हुई है। हालाँकि , मैं एक संभावित सीमा देख सकता हूँ: इसमें शामिल होने के क्रम में जॉइन कियाUSING
जा सकता है , क्योंकि परिणामस्वरूप ज्वाइंट कॉलम एक संयुक्त उत्पाद है। जिससे जॉइन के पुन: संचालन में संभावित सीमित विकल्प हैं।