Коя от тези заявки е по-бърза?
НЕ СЪЩЕСТВУВА:
SELECT ProductID, ProductName
FROM Northwind..Products p
WHERE NOT EXISTS (
SELECT 1
FROM Northwind..[Order Details] od
WHERE p.ProductId = od.ProductId)
Или НЕ Е В:
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.
Ако планиращият изпълнението каже, че са еднакви, значи са еднакви. Използвайте това, което ще направи намерението ви по-очевидно - в случая второто.
Всъщност смятам, че това ще е най-бързото:
SELECT ProductID, ProductName
FROM Northwind..Products p
outer join Northwind..[Order Details] od on p.ProductId = od.ProductId)
WHERE od.ProductId is null
Това зависи от..
SELECT x.col
FROM big_table x
WHERE x.key IN( SELECT key FROM really_big_table );
не би било сравнително бавно не е много да се ограничи размера на това, което заявката проверка, за да видите дали те ключ е в. EXISTS би било за предпочитане в този случай.
Но в зависимост от оптимизатора на СУБД това може да не е различно.
Като пример за това кога 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