NOT IN vs NOT EXISTS

Bu sorgulardan hangisi daha hızlıdır?

MEVCUT DEĞİL:

SELECT ProductID, ProductName 
FROM Northwind..Products p
WHERE NOT EXISTS (
    SELECT 1 
    FROM Northwind..[Order Details] od 
    WHERE p.ProductId = od.ProductId)

Ya da İÇERDE DEĞİL:

SELECT ProductID, ProductName 
FROM Northwind..Products p
WHERE p.ProductID NOT IN (
    SELECT ProductID 
    FROM Northwind..[Order Details])

Sorgu yürütme planı, her ikisinin de aynı şeyi yaptığını söylüyor. Eğer durum buysa, önerilen biçim hangisidir?

Bu, NorthWind veri tabanına dayanmaktadır.

[Düzenle]

Bu yararlı makaleyi yeni buldum: http://weblogs.sqlteam.com/mladenp/archive/2007/05/18/60210.aspx

Sanırım VAR OLMAYAN ile devam edeceğim.

Eğer uygulama planlayıcısı aynı olduklarını söylüyorsa, aynıdırlar. Hangisi niyetinizi daha açık hale getirecekse onu kullanın - bu durumda ikincisini.

Yorumlar (2)

Aslında, bunun en hızlısı olacağına inanıyorum:

SELECT ProductID, ProductName 
    FROM Northwind..Products p  
          outer join Northwind..[Order Details] od on p.ProductId = od.ProductId)
WHERE od.ProductId is null
Yorumlar (4)

Değişir.

SELECT x.col
FROM big_table x
WHERE x.key IN( SELECT key FROM really_big_table );

nispeten yavaş olmayacaktır, anahtarın içinde olup olmadığını görmek için sorgunun kontrol ettiği boyutu sınırlamak için fazla bir şey yoktur. Bu durumda EXISTS tercih edilebilir.

Ancak, DBMS'nin optimize edicisine bağlı olarak, bu farklı olmayabilir.

EXISTS'in ne zaman daha iyi olduğuna bir örnek olarak

SELECT x.col
FROM big_table x
WHERE EXISTS( SELECT key FROM really_big_table WHERE key = x.key);
  AND id = very_limiting_criteria
Yorumlar (2)