NOT IN vs NOT EXISTS

Který z těchto dotazů je rychlejší?

NEEXISTUJE:

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

Nebo NENÍ V:

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

Plán provádění dotazu říká, že oba dělají totéž. Pokud je to tak, který tvar je doporučený?

Toto vychází z databáze NorthWind.

[Upravit]

Právě jsem našel tento užitečný článek: http://weblogs.sqlteam.com/mladenp/archive/2007/05/18/60210.aspx

Myslím, že zůstanu u NOT EXISTS.

Pokud plánovač provedení tvrdí, že jsou stejné, jsou stejné. Použijte ten, který učiní váš záměr zřejmějším - v tomto případě druhý.

Komentáře (2)

Vlastně si myslím, že by to bylo nejrychlejší:

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

To záleží na..

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

by nebylo relativně pomalé není'moc omezit velikost toho, co dotaz zkontrolovat, zda je klíč je v. EXISTS by bylo v tomto případě vhodnější.

Ale v závislosti na optimalizátoru DBMS'by to nemuselo být jinak.

Jako příklad, kdy je lepší EXISTS

SELECT x.col
FROM big_table x
WHERE EXISTS( SELECT key FROM really_big_table WHERE key = x.key);
  AND id = very_limiting_criteria
Komentáře (2)