Как сделать SQL-запрос быстрее?
У меня большая БД. Это около 1 млн. Строк. Мне нужно сделать что-то вроде этого:
select * from t1 WHERE id1 NOT IN (SELECT id2 FROM t2)
Но это работает очень медленно. Я знаю, что могу сделать это, используя синтаксис "JOIN", но я не могу понять, как.
3 ответа
Попробуйте так:
select *
from t1
left join t2 on t1.id1 = t2.id
where t2.id is null
Прежде всего вы должны оптимизировать ваши индексы в обеих таблицах, а после этого вы должны использовать соединение
Есть несколько способов, которыми dbms может справиться с этой задачей:
Он может выбрать id2 из t2, а затем выбрать все t1, где id1 не входит в этот набор. Вы предлагаете это, используя предложение IN.
Он может выбрать запись по записи из t1 и искать каждую запись, если найдет совпадение в t2. Вы можете предложить это, используя предложение EXISTS.
Вы можете присоединиться к таблице, затем отбросить все совпадения и остаться с несоответствующими записями. Это может выглядеть как плохой способ, особенно когда есть много совпадений, потому что вы получите большие промежуточные данные, а затем выбросите большую их часть. Однако, в зависимости от того, как работает dbms, это может быть довольно быстро, например, когда он применяет методы хеш-соединения.
Все зависит от размеров таблицы, количества совпадений, индексов и т. Д. И от того, что dbms делает из вашего запроса. Есть DBMS, которые могут полностью переписать ваш запрос, чтобы найти лучший план выполнения.
Сказав все это, вы можете просто попробовать разные вещи:
- предложение IN с помощью (ВЫБЕРИТЕ DISTINCT id2 FROM t2). DISTINCT может значительно уменьшить промежуточный результат и действительно ускорить ваш запрос. (Но, возможно, ваша база данных делает это в любом случае, чтобы получить хороший план выполнения.)
- используйте предложение EXISTS и посмотрите, быстрее ли это
- внешнее соединение, предложенное Parado