De um modo geral,
INNER JOIN
e EXISTS
são coisas diferentes. O primeiro retorna duplicatas e colunas de ambas as tabelas, o segundo retorna um registro e, sendo um predicado, retorna registros de apenas uma tabela.
Se você fizer uma junção interna em um
UNIQUE
coluna, eles exibem o mesmo desempenho. Se você fizer uma junção interna em um conjunto de registros com
DISTINCT
aplicado (para se livrar das duplicatas), EXISTS
geralmente é mais rápido. IN
e EXISTS
cláusulas (com uma correlação equijoin) geralmente empregam um dos vários SEMI JOIN
algoritmos que geralmente são mais eficientes que um DISTINCT
em uma das mesas. Veja este artigo no meu blog:
- IN x JOIN x EXISTS