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.
Oi Milton, parabéns pela série de artigos. Muito bom, tunning de SQL é sem dúvida um assunto pouco discutido na comunidade e de grande importância. Show de bola!
Um abraço,
Rodrigo Santana.
Muito bom Milton..Tenho acompanhado pois é interessantes e como falou Rodrigo pouco discutido..
Realmente Rodrigo, pouco discutido mesmo.
Mas a parte boa é que esses estão sendo de ótimas qualidades.
Parabéns Milton
Emerson Martins
Realmente Emerson, de ótima qualidade mesmo. Gostaria de ver o Milton escrever também sobre planos de execução em alguma outra série de posts. Seria muito legal. 🙂
Um abraço!
Rodrigo Santana.
Olá Rodrigo, e Emerson!
Com certeza eu pretendo sim postar sobre planos de execução, e te confesso que esse é um assunto que vou precisar estudar e aprender primeiro – por isso ainda não postei nada sobre isso. Sei o “básico”, que a gente aprende em cursos por aí, mas não tenho tanta experiência profissional, e é isso que realmente nos dá coonhecimento no assunto.
Por isso comecei com posts mais simples!
Muito obrigado pela visita e pelos elogios!
Abraço
Muito bom os artigos..
Sobre o IN e EXISTS, em alguns casos fica melhor ainda usando outra logica
SQL> SELECT department_id, department_name
2 FROM departments d
3 WHERE (SELECT 1 FROM employees e
4 WHERE e.department_id = d.department_id) = 1;
Parabéns Milton..