मुझे नहीं लगता कि यह बहुत धीमी गति से होने के साथ कुछ भी करना है; यह संभावित रूप से गलत होने के साथ करना है। उदाहरण के लिए, निम्नलिखित डेटा दिए गए हैं - आदेश जो किसी व्यक्तिगत ग्राहक या बी 2 बी भागीदार द्वारा रखे जा सकते हैं:
DECLARE @Customers TABLE(CustomerID INT);
INSERT @Customers VALUES(1),(2);
DECLARE @Orders TABLE(OrderID INT, CustomerID INT, CompanyID INT);
INSERT @Orders VALUES(10,1,NULL),(11,NULL,5);
मान लीजिए कि मैं उन सभी ग्राहकों को खोजना चाहता हूं जिन्होंने कभी ऑर्डर नहीं दिया है। डेटा को देखते हुए, केवल एक ही है: ग्राहक # 2। इस जानकारी को खोजने के लिए क्वेरी लिखने के बारे में मैं यहां तीन तरीके बता सकता हूं (अन्य हैं):
SELECT [NOT IN] = CustomerID FROM @Customers
WHERE CustomerID NOT IN (SELECT CustomerID FROM @Orders);
SELECT [NOT EXISTS] = CustomerID FROM @Customers AS c
WHERE NOT EXISTS (SELECT 1 FROM @Orders AS o
WHERE o.CustomerID = c.CustomerID);
SELECT [EXCEPT] = CustomerID FROM @Customers
EXCEPT SELECT CustomerID FROM @Orders;
परिणाम:
NOT IN
------
-- <-- no results. Is that what you expected?
NOT EXISTS
----------
2
EXCEPT
------
2
अब, कुछ प्रदर्शन मुद्दे भी हैं, और मैं इस ब्लॉग पोस्ट में उनके बारे में बात करता हूं । डेटा और इंडेक्स के आधार पर, NOT EXISTS
आमतौर पर बेहतर प्रदर्शन करेगा NOT IN
, और मुझे नहीं पता कि क्या यह कभी भी खराब प्रदर्शन कर सकता है। आपको यह भी ध्यान देना चाहिए कि EXCEPT
एक अलग प्रकार का ऑपरेशन शुरू कर सकता है, इसलिए आप अलग-अलग डेटा (फिर से, स्रोत पर निर्भर करता है) के साथ समाप्त हो सकते हैं। और यह कि लोकप्रिय LEFT OUTER JOIN ... WHERE right.column IS NULL
पैटर्न हमेशा सबसे खराब प्रदर्शन करने वाला होता है।
मार्टिन स्मिथ ने एसओ पर अपने जवाब में बहुत अच्छी सहायक जानकारी दी है ।
IN
/NOT IN
हमेशा नेस्टेड छोरों के साथ लागू किया जाएगा। और मुझे नहीं पता कि क्याstops SQL Server from creating a ‘plan’
मतलब है।