Существуют различные способы СУБД могут справиться с этой задачей:
Он может выбрать id2 из t2 и затем выбрать все t1, где id1 не находится в этом наборе. Вы предлагаете это, используя предложение IN.
Он может выбирать запись по записи из t1 и искать каждую запись, если находит совпадение в t2. Вы предложили бы это, используя предложение EXISTS.
Вы можете подключить внешнее соединение к таблице, а затем отбросить все совпадения и остаться с несоответствующими записями. Это может показаться неудачным, особенно когда есть много совпадений, потому что вы получите большие промежуточные данные, а затем выбросите большую часть. Однако, в зависимости от того, как работает dbms, он может быть довольно быстрым, например, когда он применяет методы хеш-соединения.
Все зависит от размеров таблицы, количества совпадений, индексов и т. Д. И от того, что делает dbms из вашего запроса. Есть dbms, которые могут полностью переписать ваш запрос, чтобы найти лучший план выполнения.
Сказав все это, вы можете просто попробовать разные вещи:
- оговорка В с (SELECT DISTINCT ID2 FROM t2). DISTINCT может значительно сократить промежуточный результат и действительно ускорить ваш запрос. (Но, может быть, ваш DBMS делает это так или иначе, чтобы получить хороший план выполнения.)
- Используйте EXISTS статью и посмотреть, если это быстрее
- внешнее соединение предложено Parado ответ
Check parado и вместо того, чтобы использовать выберите *, просто выберите нужные столбцы. Например. select column1, column2 from .. –