समस्या यह है कि आप OR के साथ दो शर्तें निर्दिष्ट कर रहे हैं जो आपकी क्वेरी में अलग-अलग तालिकाओं पर लागू होती हैं। इस वजह से, गैर-संकुल अनुक्रमणिका खोज को आपकी बड़ी तालिका में अधिकांश या सभी पंक्तियों को वापस करना होगा क्योंकि OR तर्क का अर्थ है कि वे दूसरी तालिका में स्थिति खंड से भी मेल खा सकते हैं।
उपरोक्त तीनों उदाहरणों में SQL निष्पादन योजना को देखें, और ध्यान दें कि बड़ी तालिका से गैर-संकुलित अनुक्रमणिका से निकलने वाली पंक्तियों की संख्या। अंतिम परिणाम तालिका में 800,000 पंक्तियों में से केवल 1,000 या उससे कम लौटा सकता है, लेकिन OR खंड का अर्थ है कि उस तालिका की सामग्री को दूसरी तालिका में सशर्त के साथ क्रॉस-रेफ़र किया जाना है या इसका अर्थ है कि उन्हें अंतिम के लिए आवश्यक हो सकता है क्वेरी आउटपुट।
आपकी निष्पादन योजना के आधार पर, अनुक्रमणिका खोज सभी 800,000 पंक्तियों को बड़ी तालिका में खींच सकती है क्योंकि वे दूसरी तालिका में OR खंड की शर्तों से भी मेल खा सकती हैं। UNION ALL दो अलग-अलग क्वेरी हैं, जिनमें से प्रत्येक एक टेबल है, इसलिए इंडेक्स सीक को केवल उस छोटे परिणाम सेट को आउटपुट करना होगा जो उस क्वेरी की स्थिति से मेल खा सकता है।
मुझे लगता है कि इसका मतलब बनता है। धीमी गति से चलने वाले SQL कथनों को पुन:सक्रिय करते हुए मैंने उसी स्थिति में भाग लिया है।
चीयर्स,
आंद्रे रानिएरी