2012-02-10 11 views
10

मैं ईमेल पतों की एक तालिका (EMAIL) हैमैं एसक्यूएल 'इन इन' क्वेरी को तेज़ी से कैसे कर सकता हूं? काली सूची में डाले ईमेल पतों की</p> <pre><code>EmailAddress ------------ [email protected] [email protected] [email protected] [email protected] </code></pre> <p>और एक मेज (ब्लैकलिस्ट):

EmailAddress 
------------ 
[email protected] 
[email protected] 

और मैं उन ईमेल पतों कि में हैं का चयन करना चाहते ईमेल तालिका लेकिन ब्लैकलिस्ट तालिका में नहीं। मैं कर रहा हूं:

SELECT EmailAddress 
FROM EMAIL 
WHERE EmailAddress NOT IN 
    (
     SELECT EmailAddress 
     FROM BLACKLIST 
    ) 

लेकिन जब पंक्ति गणना बहुत अधिक हो जाती है तो प्रदर्शन भयानक होता है।

मैं इसे बेहतर कैसे कर सकता हूं? (सामान्य एसक्यूएल यदि संभव हो तो मान लें। यदि नहीं, तो T-SQL मान।)

+2

अंततः चुने गए प्रश्न के प्रदर्शन में सुधार के लिए ब्लैकलिस्ट .. ईमेल मेल पता पर सूचकांक जोड़ें। – Tomek

+0

@ टोमेक - मुझे संकेत देना चाहिए था, प्रदर्शन समस्याओं में शामिल इंडेक्स के साथ हैं। – Howiecamp

उत्तर

21

आप एक बाएं बाहरी उपयोग कर सकते हैं में शामिल होने के लिए, या एक not exists खंड।

वाम बाहरी में शामिल होने:

select E.EmailAddress 
    from EMAIL E left outer join BLACKLIST B on (E.EmailAddress = B.EmailAddress) 
where B.EmailAddress is null; 

नहीं मौजूद है:

select E.EmailAddress 
    from EMAIL E where not exists 
     (select EmailAddress from BLACKLIST B where B.EmailAddress = E.EmailAddress) 

दोनों काफी सामान्य एसक्यूएल समाधान (एक विशिष्ट DB इंजन पर निर्भर नहीं है) कर रहे हैं। मैं कहूंगा कि उत्तरार्द्ध थोड़ा और अधिक प्रदर्शन करने वाला है (हालांकि बहुत कुछ नहीं)। लेकिन not in एक से निश्चित रूप से अधिक प्रदर्शनकारी।

टिप्पणीकर्ताओं के अनुसार, आप पर एक इंडेक्स बनाने का भी प्रयास कर सकते हैं, जो आपकी क्वेरी के निष्पादन को तेज करने में मदद कर सकता है।

+0

@dasblinkenlight: धन्यवाद! कहा कि। –

+0

कुछ डीबी इंजनों पर 'अस्तित्व में नहीं' तेज हो सकता है लेकिन AFAIK, SQL सर्वर स्वचालित रूप से आपके लिए अनुकूलित करता है और 'IN' को' मौजूद नहीं ' – Icarus

+0

में परिवर्तित करता है यदि मुझे गलत नहीं लगता है, तो मुझे विश्वास है कि' बाएं शामिल 'होगा धीमे हो जाएं और 'अस्तित्व में नहीं' ओपी की क्वेरी के समान प्रश्न योजना उत्पन्न करेगा। –

3

ब्लैकलिस्ट ईमेल एड्रेस के रूप में शून्य मान की अनुमति देता है तो EXISTS से भिन्न नहीं है। यदि कोई शून्य मूल्य नहीं है तो क्वेरी का परिणाम हमेशा शून्य पंक्तियों को वापस कर देगा क्योंकि प्रत्येक मान के लिए IN (null) अज्ञात/गलत नहीं है। इसलिए प्रश्न योजनाएं काफी हद तक भिन्न होती हैं लेकिन मुझे नहीं लगता कि कोई गंभीर प्रदर्शन प्रभाव होगा।

एक सुझाव है VALIDEMAIL नामक एक नई तालिका बनाने के लिए, ब्लैकलिस्ट में एक ट्रिगर जोड़ें जो पंक्तियों को डालने पर VALIDEMAIL से पते हटा देता है और BLACKLIST से हटाए जाने पर VALIDEMAIL में जोड़ता है। फिर EMAIL को उस दृश्य के साथ बदलें जो VALIDEMAIL और BLACKLIST दोनों का एक संघ है।

संबंधित मुद्दे