Diferenças entre EXISTS e IN no SQL

Um problema persistente no uso do SQL é determinar o uso adequado dos operadores EXISTS e IN. Os dois operadores podem produzir os mesmos resultados, mas nem sempre o fazem. Também há um debate considerável sobre como cada operador é otimizado para ser rápido. Os usuários devem entender os diferentes atributos de cada operador e testar os dois para determinar a função apropriada.

Operador IN

O operador IN retorna uma linha se houver um valor de tabela.O campo condicionado WHERE corresponde a uma lista de valores IN. IN é normalmente usado como parte de uma consulta principal ou em conjunto com uma subconsulta. Exemplo 1: WHERE Table.Campo in (‘a’, ‘b’, ‘c’) Exemplo 2: WHERE Table.Campo in (conjunto de valores retornados pela subconsulta)

Operador EXISTS

O operador EXISTS retorna todas as principais linhas de consulta se a subconsulta contiver uma linha. EXISTS é usado apenas em conjunto com uma subconsulta. As linhas retornadas são determinadas pela filtragem no nível da consulta principal. Exemplo: WHERE EXISTS (conjunto de valores de retorno da subconsulta)

Diferença

IN não pode avaliar NULLs, portanto, as linhas são sempre falsas e não são retornadas. EXISTS pode avaliar NULL, para que as linhas possam ser retornadas.

Semelhanças

EXIST e IN suportam subconsultas correlacionadas e não correlacionadas, e ambas podem produzir resultados principais semelhantes. Quando correlacionados, EXISTS e IN correspondem a um campo de consulta principal com um campo de subconsulta (ex: main.id = subquery.id). A subconsulta é avaliada linha por linha, para cada correspondência encontrada. Nesse caso, IN e EXISTS retornarão as mesmas linhas com base em identificações semelhantes. Quando não estão correlacionados, EXISTE e IN processam suas subconsultas primeiro e depois combinam os resultados com a consulta principal.

EXISTENTES e desempenho IN

O desempenho é determinado pelo otimizador de banco de dados e pelo plano de execução usado para o código que é executado. Para EXISTS e IN, o otimizador pode escolher caminhos diferentes. No Oracle, NO EXISTS impede uma anti-junção e geralmente prova ser mais rápido que NO IN. Em resumo, são necessárias algumas tentativas e erros para determinar o caminho mais rápido, dependendo do banco de dados e de sua versão em uso. Certifique-se de usar o operador que garante os resultados corretos, mesmo assim, tente substituir EXISTS e IN para realmente ver qual é o mais rápido.

Referências

     

    Você pode estar interessado:

    Deixe um comentário