На первый взгляд, оператор OR в SQL кажется безобидным. Нужен фильтр по нескольким условиям? Просто напиши: select count(*)
from application
where submitter_id = :user_id
or reviewer_id = :user_id; Но в реальности такой запрос может оказаться в 100 раз медленнее, чем переписанный на UNION или два подзапроса. И это не баг, а фундаментальная особенность работы планировщиков запросов. Дело в том, что:
⚡️ AND уменьшает количество данных, сузив выборку.
💥 OR расширяет набор данных, заставляя движок либо делать дорогое объединение, либо идти в полный скан таблицы. Даже при наличии индексов, оптимизатор вынужден: В примере из статьи: запрос с OR занимал 100 мс, а переписанный на подзапросы — меньше 1 мс. 💡 Использовать UNION вместо OR select count(*) from application where submitter_id = :user_id
union all
select count(*) from application where reviewer_id = :user_id; 💡 Перепроектировать схему
Вместо хранения двух колонок (submitter_id, reviewer_id) можно вынести их в отдельную таблицу app