Существуют ли какие-либо проблемы с производительностью при использовании ключевого слова «IN» в операторах SQL в местах, где мы можем использовать JOIN?
SELECT xxx
FROM xxx
WHERE ID IN (SELECT Id FROM xxx)
Существуют ли какие-либо проблемы с производительностью при использовании ключевого слова «IN» в операторах SQL в местах, где мы можем использовать JOIN?
SELECT xxx
FROM xxx
WHERE ID IN (SELECT Id FROM xxx)
Нет, можно использовать.
Вы можете написать приведенный выше запрос, используя IN, EXISTS во всех СУБД, некоторые также поддерживают INTERSECT.
Семантически это полусоединение, которое «дает мне строки из таблицы A, где у меня есть хотя бы одно совпадение в таблице B». ВНУТРЕННЕЕ СОЕДИНЕНИЕ - это "дайте мне все совпадающие строки"
Итак, если в таблице A 3 строки, а в таблице B 5 совпадающих строк:
Вот почему IN и EXISTS выдвигаются мной и другими типами SQL здесь: JOIN неверен, требует DISTINCT и будет медленнее.
EXISTS поддерживает соединения нескольких столбцов, а IN — нет в SQL Server (в других — поддерживает).
Вместо отдельного вы можете использовать group by. У меня были случаи, когда я получал лучшее время отклика, используя соединение. Обычно, когда я присоединяюсь ко всем строкам через отношение первичного ключа/внешнего ключа, а где я смотрю на неключевой столбец. Особенно, если несколько объединений. IN может ИНОГДА вызывать сканирование индекса, и соединение будет ТИПИЧНО использовать поиск, если оно идет к PK. При разработке таблиц выстраивайте первичные ключи в одном порядке и явно объявляйте отношения PK/FK. Регистрация НЕ ограничена PK / FK. Но обычно соединение используется для обхода отношений PK / FK, и в этом случае мой опыт использования соединения с выровненными ключами - лучшая производительность.
Как вы можете прочитать здесь, JOINS быстрее, чем суб- выбирает.