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.
Ç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’y a pas beaucoup de limites à la taille de ce que la requête vérifie pour voir s’il y a une clé. EXISTS serait préférable dans ce cas.
Mais, selon l’optimiseur 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