NOT IN vs NOT EXISTS

どちらのクエリが速いか?

NOT EXISTSです。

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

または NOT IN:

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

クエリの実行プランでは、どちらも同じことをしていることになっています。 その場合、どちらが推奨される形式なのでしょうか?

これは、NorthWindデータベースに基づいています。

[編集]をクリックしてください。

ちょうどこの役に立つ記事を見つけました。 http://weblogs.sqlteam.com/mladenp/archive/2007/05/18/60210.aspx

私はNOT EXISTSでいこうと思います。

実行計画者が同じだと言えば、同じだと言えます。あなたの意図がより明確になる方を使ってください - この場合は2番目です。

解説 (2)

実は、これが一番早いと思っています。

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

それは依存しています。

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

は比較的遅くはないでしょう。キーが入っているかどうかをチェックするクエリのサイズはそれほど制限されません。この場合、EXISTSが望ましいでしょう。

しかし、DBMSのオプティマイザによっては、これと変わらないかもしれません。

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
解説 (2)