NOT IN vs NOT EXISTS

Kumpi näistä kyselyistä on nopeampi?

NOT EXISTS:

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

Tai NOT IN:

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

Kyselyn suoritussuunnitelman mukaan molemmat tekevät saman asian. Jos näin on, kumpi on suositeltava muoto?

Tämä perustuu NorthWind-tietokantaan.

[Edit]

Löysin juuri tämän hyödyllisen artikkelin: http://weblogs.sqlteam.com/mladenp/archive/2007/05/18/60210.aspx

Taidan pitää kiinni NOT EXISTSistä.

Jos toteutussuunnittelija sanoo, että ne ovat samat, ne ovat samat. Käytä sitä, joka tekee aikomuksestasi selvemmän - tässä tapauksessa toista.

Kommentit (2)

Itse asiassa uskon, että tämä olisi nopein:

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

Se riippuu...

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

ei olisi suhteellisen hidas ei ole't paljon rajoittaa kokoa, mitä kysely tarkistaa, onko ne avain on. EXISTS olisi parempi tässä tapauksessa.

Mutta riippuen DBMS:stä'n optimoijasta, tämä voi olla sama asia.

Esimerkki siitä, milloin EXISTS on parempi.

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