NÃO EM VEZES DE EXISTÊNCIA

Qual destas perguntas é a mais rápida?

NÃO EXISTEM:

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

Ou NÃO EM:

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

O plano de execução da consulta diz que ambos fazem a mesma coisa. Se for esse o caso, qual é a forma recomendada?

Isto é baseado na base de dados NorthWind.

[Editar]

Acabei de encontrar este artigo útil: http://weblogs.sqlteam.com/mladenp/archive/2007/05/18/60210.aspx

Eu acho que I'vai ficar com NOT EXISTS.

Se o planejador de execução diz que eles'são iguais, eles'são iguais. Use o que tornar sua intenção mais óbvia -- neste caso, o segundo.

Comentários (2)

Na verdade, acredito que este seria o mais rápido:

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

Depende...

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

não seria relativamente lento o is't muito para limitar o tamanho do que a consulta verifica para ver se a chave está dentro. Neste caso, seria preferível EXISTS.

Mas, dependendo do otimizador do SGBD's, isto não poderia ser diferente.

Como exemplo de quando EXISTS é melhor

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