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