IN = BAD, EXISTS = GOOD!

Você pode estar se perguntando: IN e EXISTS são diferentes, e usados em diferentes situações! Como posso dizer que um é “bom” e o outro é “ruim”?

Assim como nos posts anteriores desta série – Tuning de SQL – temo que prestar atenção nos casos em que essas “dicas” são aplicáveis. Obviamente o EXISTS não pode simplesmente substituir o IN em todos os casos – e o desenvolvedor/programador/analista/DBA é quem deve analisar o caso e verificar se é possível aplicar esta melhoria.

Usamos o IN para verificar se um valor está contido em uma lista, enquanto o EXISTS é usado para verificar a existência de linhas retornadas por uma subconsulta. IN verifica os valores reais, enquanto EXISTS apenas verifica a existência. Geralmente EXISTS tem um melhor desempenho do que IN em subconsultas – e como nosso objetivo aqui é desempenho, devemos usar EXISTS ao invés de IN sempre que possível.

DISTINCT = BAD, EXISTS = GOOD!

Quando queremos suprimir linhas duplicadas, ou seja, não queremos linhas completamente repetidas no retorno de um SELECT, usamos a cláusula DISTINCT, correto? Para essa operação ser realizada, internamente o banco faz uma ordenação das linhas recuperadas para facilitar assim a exclusão das linhas repetidas.

Em alguns casos, é possível substituir o DISTINCT pelo EXISTS. O resultado do SELECT será o mesmo, porém, o Oracle não tem o custo de classificar todas as linhas para excluir as repetidas.