अनुक्रमित के संबंध में नहीं तर्क का उपयोग


12

डेटाबेस विकास परीक्षा पर Microsoft की पुस्तक 70-433 के अनुसार: Microsoft SQL Server 2008 डेटाबेस विकास :

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

तो मुझे लगता है कि होने के लिए NOT IN, NOT EXISTSआदि

अब इस SO प्रश्न के संबंध में , मुझे लगा कि @GBN द्वारा चुना गया समाधान ऊपर दिए गए कथन का उल्लंघन करेगा।

जाहिर है, यह नहीं है।

तो मेरा सवाल है: क्यों?

जवाबों:


21
  • NOT IN (SELECT ...)और NOT EXISTS (SELECT .. WHERE correlation..)"एंटी सेमी जॉइन" हैं। यह है, मान्यता प्राप्त सेट आधारित संचालन

  • WHERE NOT (MyColumn = 1) एक ऐसा फिल्टर है जिसे देखने के लिए सभी पंक्तियों की आवश्यकता होती है

अधिक जानकारी के लिए, देखें:

संपादित करें: पूर्णता के लिए

वाम जॉइन अक्सर खराब प्रदर्शन करते हैं। Http://explainextended.com/2009/09/15/not-in-vs-not-exists-vs-left-join-is-null-sql-server देखें

यह वही साइट नोट करता है कि MySQL में, अन्य RDBMS की तरह EXISTS को अनुकूलित नहीं किया गया है और LEFT JOIN बेहतर है

SQL सर्वर में, मैं अनुभव से जानता हूं कि LEFT JOIN नहीं और साथ ही साथ EXISTS भी नहीं चलता है। आपको अक्सर वही परिणाम प्राप्त करने के लिए DISTINCT की आवश्यकता होती है जो एक और प्रसंस्करण कदम है।


0

मैं इसके लिए एक उप-चयन का उपयोग करता हूं:

SELECT m* from Main AS m 
    WHERE m.id NOT IN 
        (SELECT m2.id FROM Main AS m2 
           WHERE m2.id IN (...possibly null/empty list goes here...));

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

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