Эта тема довольно старая, но часто упоминается. На мой личный вкус это немного неполно, потому что есть другой способ запросить базу данных с ключевым словом EXISTS, которое я нашел быстрее, чем нет.
Поэтому, если вас интересуют только значения из таблицы a, вы можете использовать этот запрос:
SELECT a.*
FROM a
WHERE EXISTS (
SELECT *
FROM b
WHERE b.col = a.col
)
Разница может быть огромной, если col не проиндексирован, потому что БД не нужно находить все записи в b, которые имеют одинаковое значение в col, он должен найти только самую первую. Если на b.col нет индекса, а при просмотре таблицы ba может быть много записей, это может быть следствием. Для IN или JOIN это будет полное сканирование таблицы, для EXISTS это будет только частичное сканирование таблицы (до тех пор, пока не будет найдена первая соответствующая запись).
Если в b много записей с одинаковым значением col, вы также потратите много памяти на чтение всех этих записей во временное пространство, просто чтобы убедиться, что ваше условие удовлетворено. С существующим этого обычно можно избежать.
Я часто находил EXISTS быстрее, чем IN, даже если есть индекс. Это зависит от системы баз данных (оптимизатора), данных и, что не менее важно, от типа используемого индекса.