Çok yavaş olmakla ilgisi olduğunu düşünmüyorum; potansiyel olarak yanlış olmakla ilgilidir. Örneğin, aşağıdaki veriler - bireysel bir müşteri veya bir B2B iş ortağı tarafından verilebilecek siparişler verildiğinde:
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);
Diyelim ki hiç sipariş vermeyen tüm müşterileri bulmak istiyorum. Veriler göz önüne alındığında, sadece bir tane var: müşteri # 2. İşte bu bilgileri bulmak için bir sorgu yazma hakkında üç yolu: (diğerleri vardır):
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;
Sonuçlar:
NOT IN
------
-- <-- no results. Is that what you expected?
NOT EXISTS
----------
2
EXCEPT
------
2
Şimdi, bazı performans sorunları da var ve bu blog yazısında onlar hakkında konuşuyorum . Verilere ve endekslere bağlı olarak, NOT EXISTS
genellikle daha iyi performans gösterir NOT IN
ve daha kötü performans gösterip gösteremeyeceğini bilmiyorum. Ayrıca EXCEPT
, farklı bir sıralama işlemi getirebileceğini de unutmamalısınız , böylece farklı veriler elde edebilirsiniz (yine kaynağa bağlı olarak). Ve popüler LEFT OUTER JOIN ... WHERE right.column IS NULL
desen her zaman en kötü performanstır.
Martin Smith, SO'ya verdiği yanıtta da çok iyi destekleyici bilgiye sahiptir .
IN
/NOT IN
her zaman iç içe döngüler ile uygulanacaktır. Ve nestops SQL Server from creating a ‘plan’
demek istediğimi bilmiyorum .