NOT IN vs. NOT EXISTS

Welche dieser Abfragen ist die schnellere?

NOT EXISTS:

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

Oder NOT IN:

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

Der Abfrageausführungsplan sagt, dass beide das Gleiche tun. Wenn das der Fall ist, welche Form ist dann die empfohlene?

Dies basiert auf der NorthWind-Datenbank.

[Bearbeiten]

Ich habe gerade diesen hilfreichen Artikel gefunden: http://weblogs.sqlteam.com/mladenp/archive/2007/05/18/60210.aspx

Ich denke, ich werde bei NOT EXISTS bleiben.

Wenn der Ausführungsplaner sagt, dass sie gleich sind, sind sie gleich. Verwenden Sie denjenigen, der Ihre Absicht deutlicher macht - in diesem Fall den zweiten.

Kommentare (2)

Ich glaube sogar, dass dies der schnellste Weg wäre:

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

Es kommt darauf an...

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

wäre nicht relativ langsam die isn't viel zu begrenzen Größe dessen, was die Abfrage überprüfen, um zu sehen, wenn sie Schlüssel ist in. EXISTS wäre in diesem Fall vorzuziehen.

Aber, abhängig von der DBMS's Optimierer, könnte dies nicht anders sein.

Ein Beispiel dafür, wann EXISTS besser ist

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