लेकिन उदाहरण में, पहली क्वेरी में कॉलम a
. पर एक शर्त है , जबकि दूसरी क्वेरी में कॉलम b
. पर एक शर्त है . यह शायद एक ऐसी क्वेरी से आया है जिसे ऑप्टिमाइज़ करना मुश्किल है:
SELECT * FROM mytable WHERE a=X OR b=Y
सरल बी-पेड़ अनुक्रमण के साथ इस क्वेरी को अनुकूलित करना कठिन है। क्या इंजन a
. कॉलम पर कोई इंडेक्स खोजता है ? या कॉलम b
. पर ? किसी भी तरह से, दूसरे शब्द को खोजने के लिए टेबल-स्कैन की आवश्यकता होती है।
इसलिए एक शब्द के लिए दो प्रश्नों में अलग करने के लिए यूनियन का उपयोग करने की चाल। प्रत्येक सबक्वेरी प्रत्येक खोज शब्द के लिए सर्वोत्तम अनुक्रमणिका का उपयोग कर सकती है। फिर UNION का उपयोग करके परिणामों को संयोजित करें।
लेकिन दो उपसमुच्चय ओवरलैप हो सकते हैं, क्योंकि कुछ पंक्तियाँ जहाँ b=Y
a=X
. भी हो सकता है जिस स्थिति में ऐसी पंक्तियाँ दोनों सबसेट में होती हैं। इसलिए आपको डुप्लीकेट एलिमिनेशन करना होगा, वरना फाइनल रिजल्ट में कुछ पंक्तियों को दो बार देखना होगा।
SELECT * FROM mytable WHERE a=X
UNION DISTINCT
SELECT * FROM mytable WHERE b=Y
UNION DISTINCT
महंगा है क्योंकि विशिष्ट कार्यान्वयन डुप्लिकेट खोजने के लिए पंक्तियों को क्रमबद्ध करते हैं। ठीक वैसे ही जैसे अगर आप SELECT DISTINCT ...
. का इस्तेमाल करते हैं ।
हमारी यह भी धारणा है कि यह और भी "बर्बाद" काम है यदि आप जिन पंक्तियों के दो सबसेट को जोड़ रहे हैं, उनमें दोनों सबसेट में बहुत सारी पंक्तियाँ हैं। इसे समाप्त करने के लिए बहुत सी पंक्तियाँ हैं।
लेकिन डुप्लिकेट को खत्म करने की कोई आवश्यकता नहीं है यदि आप गारंटी दे सकते हैं कि पंक्तियों के दो सेट पहले से ही अलग हैं। यही है, अगर आप गारंटी देते हैं कि कोई ओवरलैप नहीं है। यदि आप उस पर भरोसा कर सकते हैं, तो डुप्लीकेट को खत्म करने के लिए यह हमेशा एक नो-ऑप होगा, और इसलिए क्वेरी उस चरण को छोड़ सकती है, और इसलिए महंगा सॉर्टिंग छोड़ सकती है।
यदि आप क्वेरी बदलते हैं ताकि वे पंक्तियों के गैर-अतिव्यापी उपसमुच्चय का चयन करने की गारंटी दें, तो यह एक जीत है।
SELECT * FROM mytable WHERE a=X
UNION ALL
SELECT * FROM mytable WHERE b=Y AND a!=X
इन दो सेटों में कोई ओवरलैप नहीं होने की गारंटी है। यदि पहले सेट में पंक्तियाँ हैं जहाँ a=X
और दूसरे सेट में पंक्तियाँ हैं जहाँ a!=X
तब कोई पंक्ति नहीं हो सकती जो दोनों सेटों में हो।
इसलिए दूसरी क्वेरी केवल कुछ . को पकड़ती है उन पंक्तियों में जहां b=Y
, लेकिन कोई भी पंक्ति जहां a=X AND b=Y
पहले सेट में पहले से ही शामिल है।
तो क्वेरी दो OR
. के लिए एक अनुकूलित खोज प्राप्त करती है शब्द, डुप्लीकेट तैयार किए बिना, और किसी UNION DISTINCT
. की आवश्यकता नहीं है ऑपरेशन।