Использование «IN» с подзапросом в выражениях SQL - PullRequest
7 голосов
/ 06 августа 2011

Существуют ли проблемы с производительностью использования ключевого слова IN в инструкциях SQL в местах, где мы можем использовать JOIN?

SELECT xxx
FROM xxx
WHERE ID IN (SELECT Id FROM xxx)

Ответы [ 3 ]

10 голосов
/ 06 августа 2011

Нет, все в порядке.

Вы можете написать запрос выше, используя IN, EXISTS во всех RDBMS, некоторые также поддерживают INTERSECT.

Семантически это полусоединение, которое "дает мне строки из таблицы A, где у меня есть хотя бы одно совпадение в таблице B". ВНУТРЕННЕЕ СОЕДИНЕНИЕ "дай мне все подходящие строки"

Итак, если в TableA 3 строки, а в TableB 5 совпадающих строк:

  • ВНУТРЕННЕЕ СОЕДИНЕНИЕ - 15 строк
  • полусоединение состоит из 3 строк

Вот почему IN и EXISTS выдвигаются мной и другими типами SQL здесь: JOIN неверен, требует DISTINCT и будет медленнее.

EXISTS поддерживает соединения с несколькими столбцами, IN в SQL Server отсутствует (в других).

0 голосов
/ 07 августа 2011

Вместо отдельного вы можете использовать группу по. У меня были случаи, когда я получал лучшее время отклика, используя соединение. Обычно, когда я соединяю все строки с помощью отношения первичный ключ / внешний ключ и где выполняется поиск не ключевого столбца. Особенно если несколько соединений. IN может SOMETIMES вызывать сканирование индекса, и соединение TYPICALLY будет использовать поиск, если оно идет на PK. При разработке таблиц выстраивайте первичные ключи так, чтобы они были в том же порядке, и явно объявляли отношения PK / FK. Регистрация НЕ ограничена PK / FK. Но обычно объединение используется для обхода отношений PK / FK, и в этом случае мой опыт использования объединения с выровненными ключами является наилучшей производительностью.

0 голосов
/ 06 августа 2011

Как вы можете прочитать здесь , JOINS быстрее, чем подвыборы.

...