IN/EXISTS e NOT IN/NOT EXISTS

Tuning de Banco, Tuning de SQL, Ferramentas de tuning
Responder
dejambo
Rank: Programador Sênior
Rank: Programador Sênior
Mensagens: 68
Registrado em: Qua, 27 Jun 2012 8:58 am

Boa Tarde,

Gostaria de saber qual a diferença desses operadores...são iguais?retornam o mesmo resultado?Se possível gostaria de um exemplo, já li alguns textos na internet...mas não consegui entender muito bem as diferenças deles. Obrigado.
DanielNN
Moderador
Moderador
Mensagens: 641
Registrado em: Seg, 03 Set 2007 3:26 pm
Localização: Fortaleza - CE
att,

Daniel N.N.

Em geral, eles retornam o mesmo resultado. Um não é necessariamente melhor que o outro em termos de desempenho, vai depender de como está seus dados, e sua consulta.
Porém, o "NOT IN" e "NOT EXISTS" podem retornar dados diferentes quando utilizados campos que podem ser nulo.
Pegando um exmplo pronto do tom:

Selecionar tudo

SQL> select count(*) from emp where empno not in ( select mgr from emp );

  COUNT(*)
----------
         0
Aparentemente, todo empregrado é gerente. Porém:

Selecionar tudo

SQL> select count(*) from emp T1
  2  where not exists ( select null from emp T2 where t2.mgr = t1.empno );

  COUNT(*)
----------
         9
Já com o "not exists" notamos que existem 9 pessoas que não são gerentes. No "NOT IN" ele ignora os NULL.

Outra coisa, os campos de retorno dentro de um EXISTS não importa. Ele só verifica se a consulta "roda" ou não.
Avatar do usuário
fbifabio
Moderador
Moderador
Mensagens: 199
Registrado em: Ter, 22 Fev 2011 1:51 pm
Localização: São Paulo - SP
Contato:
Fábio Prado
www.fabioprado.net

Pessoal,

De acordo com o "Oracle Database Performance Tuning Guide", em certas circunstâncias é melhor utilizar IN do que EXISTS e vice-versa.

Em geral, em ambientes OLTP, se o predicado seletivo está na subquery utilize IN. Se o predicado seletivo está na query pai, utilize EXISTS.

Mais detalhes explico e demonstro em meus treinamentos de SQL Tuning: http://www.fabioprado.net/p/sql-tuning- ... racle.html

[]s

Fábio Prado
www.fabioprado.net
Responder
  • Informação
  • Quem está online

    Usuários navegando neste fórum: Nenhum usuário registrado e 5 visitantes