Utilizando not exists / exists ou not in / in no PL/SQL (Oracle)

[ad#texto]

Existe uma certa confusão no mundo Oracle sobre qual é mais rápido not exists / exists ou not in / in.

not exists ou not in?
not exists ou not in?

Porém essa é uma pergunta sem uma resposta direta e simples. Sabe porque? O Oracle utiliza um avançado e complexo sistema de estatítica que coleta em tempo real o modo de utilização das queries do seu banco de dados e dessa forma otimiza sua engine (em tempo de execução) para trabalhar de acordo com o seu próprio uso, ou seja, ele é mutante.

Assim para alguns desenvolvedores o not in / in pode ser mais rápido e para outros o not exists / exists pode ser melhor, vai depender do seu ambiente de produção e da sua implementação do Oracle.

Como faço para saber qual utilizar então? Simples, implementando e testando ambos os casos, essa é a melhor maneira de descobrir.

Em todo caso vou listar exemplos de uso de ambas as situações, você implementa, testa e verifica qual é o mais rápido e melhor para o seu uso.

  • not exist/exist:
select *
from tabelaA
where not exists (
                 select campoA from tabelaB 
                 where campoB = valor
                 )

ou

select *
from tabelaA
where exists (
             select campoA from tabelaB 
             where campoB = valor
             )
  • not in/in:
select *
from tabelaA
where not in (
             select campoA from tabelaB 
             where campoB = valor
             )

ou

select *
from tabelaA
where in ( 
          select campoA from tabelaB 
          where campoB = valor
         )

Petter Rafael

Desenvolvedor Web atua com as tecnologias Java e PHP apoiadas pelos bancos de dados Oracle e MySQL. Além dos ambientes de desenvolvimento acima possuiu amplo conhecimento em servidores Apache/Tomcat, Photoshop, Arte & Foto, Flash e mais uma dezena de ferramentas e tecnologias emergentes. Atualmente colabora com o Viablog escrevendo sobre programação e tecnologia.