2014-02-07 10 views
0

У меня большой БД. Это около 1 млн. Строк. Мне нужно сделать что-то вроде этого:Как сделать SQL-запрос быстрее?

select * from t1 WHERE id1 NOT IN (SELECT id2 FROM t2) 

Но он работает очень медленно. Я знаю, что могу это сделать, используя синтаксис JOIN, но я не понимаю, как это сделать.

+0

Check parado и вместо того, чтобы использовать выберите *, просто выберите нужные столбцы. Например. select column1, column2 from .. –

ответ

5

Попробуйте так:

select * 
from t1 
left join t2 on t1.id1 = t2.id 
where t2.id is null 
+0

# 1317 - Выполнение запроса было прервано –

1

Прежде всего вы должны оптимизировать свои показатели в обеих таблицах, и после этого вы должны использовать присоединиться

0

Существуют различные способы СУБД могут справиться с этой задачей:

Он может выбрать id2 из t2 и затем выбрать все t1, где id1 не находится в этом наборе. Вы предлагаете это, используя предложение IN.

Он может выбирать запись по записи из t1 и искать каждую запись, если находит совпадение в t2. Вы предложили бы это, используя предложение EXISTS.

Вы можете подключить внешнее соединение к таблице, а затем отбросить все совпадения и остаться с несоответствующими записями. Это может показаться неудачным, особенно когда есть много совпадений, потому что вы получите большие промежуточные данные, а затем выбросите большую часть. Однако, в зависимости от того, как работает dbms, он может быть довольно быстрым, например, когда он применяет методы хеш-соединения.

Все зависит от размеров таблицы, количества совпадений, индексов и т. Д. И от того, что делает dbms из вашего запроса. Есть dbms, которые могут полностью переписать ваш запрос, чтобы найти лучший план выполнения.

Сказав все это, вы можете просто попробовать разные вещи:

  • оговорка В с (SELECT DISTINCT ID2 FROM t2). DISTINCT может значительно сократить промежуточный результат и действительно ускорить ваш запрос. (Но, может быть, ваш DBMS делает это так или иначе, чтобы получить хороший план выполнения.)
  • Используйте EXISTS статью и посмотреть, если это быстрее
  • внешнее соединение предложено Parado ответ