JOIN क्लॉज में निर्माण का उपयोग कुछ मामलों में अनुकूलन बाधाओं का परिचय दे सकता है?


35

यह मेरे ध्यान में लाया गया कि प्रश्नों के खंड में USINGनिर्माण (इसके बजाय ON) कुछ मामलों में अनुकूलन बाधाओं का परिचय दे सकता है।FROMSELECT

मेरा मतलब है कि यह महत्वपूर्ण शब्द:

चुनते हैं *
एक से
JOIN b USING (a_id)

बस अधिक जटिल मामलों में।

प्रसंग: इस प्रश्न के लिए यह टिप्पणी

मैं इस का उपयोग एक बहुत और अब तक कुछ भी देखा कभी नहीं किया है। मुझे एक परीक्षण मामले में बहुत दिलचस्पी होगी जो आगे की जानकारी के प्रभाव या किसी भी लिंक को प्रदर्शित करेगा । मेरे खोज के प्रयास खाली आए।

सही उत्तर USING (a_id)वैकल्पिक जॉइन क्लॉज की तुलना में हीन प्रदर्शन के साथ दिखाने के लिए एक टेस्ट केस होगा ON a.a_id = b.a_id- यदि वास्तव में ऐसा हो सकता है।


2
@kgrittn: यह है कि मैं आमतौर पर अब तक की उम्मीद है: USINGयह थोड़ा तेज है - क्योंकि यह परिणाम मैट्रिक्स में एक कम स्तंभ में परिणाम है। आपके निष्कर्ष 2005 और 2008 के हैं। मुझे लगता है कि अब तक कोई भी समस्या तय नहीं हुई है। हालाँकि , मैं एक संभावित सीमा देख सकता हूँ: इसमें शामिल होने के क्रम में जॉइन किया USINGजा सकता है , क्योंकि परिणामस्वरूप ज्वाइंट कॉलम एक संयुक्त उत्पाद है। जिससे जॉइन के पुन: संचालन में संभावित सीमित विकल्प हैं।
इरविन ब्रान्डेसटेटर

1
मुझे यह धागा मिला, जो मेरे पास जितनी बार था, उसका उपयोग करने से मुझे कुछ करना पड़ सकता था, क्योंकि एक ज्वाइनिंग शर्त के साथ एक ज्वाइनिंग शर्त पर डंप / रिस्टोर पर समस्याएँ आ सकती हैं: archives.postgresql.org/pubql- बग्स / 2011-06 / msg00030.php मुझे अभी भी एक अटपटा लग रहा है कि USING के साथ प्रदर्शन समस्याओं से संबंधित एक और धागा था, जहां समाधान ON का उपयोग करना था, लेकिन मैं इसे खोजने पर छोड़ देने जा रहा हूं, मुझे लगता है। यह शायद विचारों से बाहर का उपयोग करने के लिए सुरक्षित है और बस एक नैदानिक ​​कदम के रूप में बजाय एक क्वेरी धीमी है पर कोशिश करने के लिए याद है।
कृतघ्न

1
ऐसा लगता है कि "उपयोग" कोड को थोड़ा सा पढ़ने योग्य बनाता है लेकिन मुझे लगता है कि दोनों क्षेत्रों को समान नाम की आवश्यकता है। मुझे नहीं लगता कि उपयोग करने से "पर" की तुलना में बेहतर प्रदर्शन होगा, क्योंकि डीबी को वैसे भी मैच बनाने की आवश्यकता है, यह एक चयन की तरह है एक प्रदर्शन से एक ही प्रदर्शन होता है (मुझे गलत होने पर सही करें), अंतर यह है कि ज्वाइन क्लीनर है और बनाए रखना आसान है।
jcho360

2
@HLGEM: यह सिर्फ एक प्रतीकात्मक नाम है, और केवल दो तालिकाओं के साथ, मेरे उदाहरण में, भ्रम की कोई गुंजाइश नहीं है। फिर भी, मैंने प्रश्न में संशोधन किया। idकॉलम नाम के दुर्भाग्यपूर्ण उपयोग को प्रोत्साहित नहीं करना चाहेंगे ।
एरविन ब्रान्डस्टेट्टर

2
@ChristiaanWesterbeek: मैं असहमत हूं। "जाने-जगह" में गहराई Postgres जवाब के लिए है (अब भी) मेलिंग। केवल बहुत कम Postgres
dev

जवाबों:


12

इरविन: मैं इस विचार से सहमत होऊंगा कि कठोर आदेश देने के कारण, कई किनारे मामले पैदा हो सकते हैं जहां इष्टतम योजनाओं को खारिज किया जाएगा। मैंने हाल ही में किसी ऐसे व्यक्ति की मदद की जिसने अपनी क्वेरी में ऐसा कुछ किया है:

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 घंटे लगे। लेफ्ट जॉइन को डिस्ट्रीब्यूट करके, कीज़ को नीचे धकेला जा सकता है और कुछ सेकंड्स में क्वेरी चल जाती है। बेशक यह बिल्कुल समतुल्य नहीं है यही कारण है कि योजनाकार उन्हें समकक्ष नहीं मान सकता है और इसलिए यह उस योजना को एक हैश में शामिल होने और फिर एक नेस्टेड लूप के रूप में पता लगाने के लिए छोड़ दिया गया, जो दर्द से धीमा था।

जब भी आप किसी निश्चित क्रम से गुजरने के लिए जोर-जोर से जोड़ते हैं, तो आप उन मामलों को पेश करते हैं जहां योजना के निष्पादन में महत्वपूर्ण फ़िल्टर जानकारी अभी तक उपलब्ध नहीं हो सकती है, और इसलिए बाद में एक त्वरित सूचकांक स्कैन / हैश में शामिल होना संभव हो सकता है नेस्टेड लूप / अनुक्रमिक स्कैन में बहुत धीमी गति से किया जा सकता है और इसलिए जबकि उपरोक्त टुकड़ा तुरंत समकक्ष नहीं है, यह एक ही समस्या दिखाता है।

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