Este tópico é bastante antigo, mas ainda é mencionado com frequência. Para meu gosto pessoal, é um pouco incompleto, porque existe outra maneira de perguntar ao banco de dados com a palavra-chave EXISTS, que eu achei mais rápida com mais frequência.
Portanto, se você estiver interessado apenas nos valores da tabela a, poderá usar esta consulta:
SELECT a.*
FROM a
WHERE EXISTS (
SELECT *
FROM b
WHERE b.col = a.col
)
A diferença pode ser grande se col não estiver indexado, porque o banco de dados não precisa encontrar todos os registros em b que tenham o mesmo valor em col, mas apenas o primeiro. Se não houver índice no b.col e muitos registros na varredura de tabela ba puderem ser a consequência. Com IN ou JOIN, essa seria uma verificação completa da tabela; com EXISTS, isso seria apenas uma verificação parcial da tabela (até que o primeiro registro correspondente seja encontrado).
Se houver muitos registros em b com o mesmo valor de col, você também gastará muita memória ao ler todos esses registros em um espaço temporário apenas para descobrir que sua condição está satisfeita. Com existe isso geralmente pode ser evitado.
Muitas vezes encontrei EXISTS mais rápido que IN, mesmo que exista um índice. Depende do sistema de banco de dados (o otimizador), dos dados e, por último, do tipo de índice usado.