Разница между "IN" и "EXISTS" в SQL.
IN
select * from Rating
where ID_PLAYER in (
select ID_PLAYER from Players where PLAYER_STATUS = 'Active'
);
EXISTS
select * from Rating r
where exists (
select 1 from Players p
where p.ID_PLAYER = r.ID_PLAYER and p.PLAYER_STATUS = 'Active'
);
Какой способ "лучше"?
Первый способ: IN
- Проще написать
- Загружает все найденные идентификатор в память
- Будет вести себя медленнее при большой таблице Players
- Без хороших индексов может работать плохо
- Выдаст ошибку если подзапрос возвращает NULL (для NOT IN)
Второй способ: EXIST
- Быстрый поиск до первого совпадения
- Лучше работает с индексами
- Гораздо лучше работает для кореллированных подзапросов
- Игнорирует NULL
Производительность:
- На небольших наборах данных: IN и EXISTS показывают примерно одинаковую производительность.
- На больших наборах данных: EXISTS обычно выигрывает.
- Для кореллированных подзапросов: EXISTS в большинстве случаев лучший выбор.
Почему так?
Потомучто IN должен сравниваьт и сохранять каждый результат в выборке, тогда как EXISTS просто проверяет наличие нужной записи и идет дальше.
Современные планировщики на самом деле довольно умны и могут достаточно хорошо оптимизировать оба варианта запроса, тем не менее полезно знать в чем разница.