Aprenda PL/SQL

IN/EXISTS e NOT IN/NOT EXISTS

Tuning de Banco, Tuning de SQL, Ferramentas de tuning
  

Mensagemem Qui, 02 Ago 2012 2:58 pm

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.
dejambo

Mensagemem Sex, 03 Ago 2012 9:55 am

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:
Código: Selecionar todos
SQL> select count(*) from emp where empno not in ( select mgr from emp );

  COUNT(*)
----------
         0

Aparentemente, todo empregrado é gerente. Porém:
Código: Selecionar todos
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.
DanielNN
Localização: Fortaleza - CE

att,

Daniel N.N.

Mensagemem Seg, 13 Ago 2012 4:05 pm

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
fbifabio
Localização: São Paulo - SP

Fábio Prado
www.fabioprado.net



Voltar para DBA Tuning

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante