Использование «IN» с подзапросом в операторах SQL

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

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

person Community    schedule 06.08.2011    source источник


Ответы (3)


Нет, можно использовать.

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

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

Итак, если в таблице A 3 строки, а в таблице B 5 совпадающих строк:

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

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

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

person gbn    schedule 06.08.2011
comment
Это не нормально использовать. Смотрите мой ответ. - person t-clausen.dk; 06.08.2011
comment
Да, я ошибаюсь. Я пытался доказать свою правоту, приводя вас в пример. Однако пример показал, что я ошибался. Я извиняюсь и удалил свой ответ. - person t-clausen.dk; 06.08.2011

Вместо отдельного вы можете использовать group by. У меня были случаи, когда я получал лучшее время отклика, используя соединение. Обычно, когда я присоединяюсь ко всем строкам через отношение первичного ключа/внешнего ключа, а где я смотрю на неключевой столбец. Особенно, если несколько объединений. IN может ИНОГДА вызывать сканирование индекса, и соединение будет ТИПИЧНО использовать поиск, если оно идет к PK. При разработке таблиц выстраивайте первичные ключи в одном порядке и явно объявляйте отношения PK/FK. Регистрация НЕ ограничена PK / FK. Но обычно соединение используется для обхода отношений PK / FK, и в этом случае мой опыт использования соединения с выровненными ключами - лучшая производительность.

person paparazzo    schedule 07.08.2011

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

person Alex_L    schedule 06.08.2011
comment
Как вы можете прочитать в другом месте, JOIN медленнее. explainextended.com/2009/06/16/in-vs -join-vs-exists Семантика сильно отличается -1 для распространения мусора и незнания разницы - person gbn; 06.08.2011
comment
И в вашей ссылке об этом даже не упоминается - person gbn; 06.08.2011