मेरे पास एक सामान्य डेटाबेस शामिल है जिसमें तीन टेबल शामिल हैं। एक टेबल, ए, मुख्य तालिका है जिसमें प्राथमिक कुंजी id
है। टेबल्स बी और सी में प्रविष्टियों और ए के लिए सहायक डेटा होता है, और प्रत्येक में id
नामक कॉलम भी होता है जो ए id
पर इंगित करने वाली एक विदेशी कुंजी है। अब, अगर मैं ए, बी और एक क्वेरी में सी से सभी डेटा चाहते हैं, मैं लिखने होगा:ओरेकल में अनावश्यक जुड़ी स्थितियों को जोड़ने के परिणामस्वरूप एक अलग योजना
SELECT *
FROM A
INNER JOIN B
ON B.id = A.id
INNER JOIN C
ON C.id = A.id
जो निश्चित रूप से पूरी तरह से काम करता है।
हाल ही में, हमारे डीबीए हमें बताया कि इस Oracle में अक्षम है, और आप इस प्रकार, सी और बी के बीच की स्थिति में शामिल होने के रूप में अच्छी तरह की जरूरत है: इसलिए स्वाभाविक रूप से मैं नहीं था
SELECT *
FROM A
INNER JOIN B
ON B.id = A.id
INNER JOIN C
ON C.id = A.id AND C.id = B.id
यह मेरे लिए बेमानी देखा, यहाँ विश्वास नहीं है। जब तक कि मैं वास्तव में एक धीमी क्वेरी में भाग नहीं लेता था, जिसमें एक भयानक निष्पादन योजना थी, और गायब होने की स्थिति को ठीक से जोड़कर इसे ठीक करने में कामयाब रहा। मैंने दोनों संस्करणों पर योजना की व्याख्या की: एक "अनावश्यक" क्वेरी शर्त के बिना 1 035 की लागत थी, जबकि "बेहतर" में 38 9 थे (और कार्डिनिटी और बाइट्स में भी बहुत अंतर थे)। दोनों प्रश्नों ने सटीक उसी परिणाम का उत्पादन किया।
क्या कोई यह समझा सकता है कि यह अतिरिक्त स्थिति क्यों फर्क पड़ती है? मेरे लिए सी और बी भी संबंधित नहीं हैं। ध्यान दें कि यदि आप अन्य शामिल स्थिति को दूर करते हैं तो यह भी उतना ही बुरा है - दोनों को वहां रहने की आवश्यकता है।
दोनों थे, मैं आपसे सहमत हूं गैरी: यदि योजना अनावश्यक स्थिति में शामिल होने के साथ बेहतर है, तो ऐसा इसलिए है क्योंकि आंकड़े गलत हैं। आम तौर पर, आपको अनावश्यक जानकारी प्रदान नहीं करनी चाहिए। –
यह मेरे लिए सबसे अधिक आकर्षक जवाब है, क्योंकि यह ओरेकल में कुछ आशा बहाल करता है। (तो हाँ, मैं थोड़ा सा पक्षपातपूर्ण पक्षपातपूर्ण हूं।) क्या किसी के जवाब देने के लिए वास्तविक स्पष्टीकरण मुश्किल है। – waxwing