NOT IN vs NOT EXISTS

Laquelle de ces requêtes est la plus rapide ?

NON EXISTANT :

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

Ou NOT IN :

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

Le plan d'exécution de la requête indique que les deux font la même chose. Si c'est le cas, quelle est la forme recommandée ?

Ceci est basé sur la base de données NorthWind.

[Edit]

Je viens de trouver cet article utile : http://weblogs.sqlteam.com/mladenp/archive/2007/05/18/60210.aspx

Je pense que je vais m'en tenir à NOT EXISTS.

Si le planificateur d'exécution dit qu'ils sont identiques, ils sont identiques. Utilisez celle qui rendra votre intention plus évidente -- dans ce cas, la seconde.

Commentaires (2)

En fait, je crois que ce serait le plus rapide :

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

Ça dépend...

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

ne serait pas relativement lent, car il n&#8217y a pas beaucoup de limites à la taille de ce que la requête vérifie pour voir s&#8217il y a une clé. EXISTS serait préférable dans ce cas.

Mais, selon l&#8217optimiseur du SGBD, il pourrait en être de même.

Voici un exemple de cas où EXISTS est préférable

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