0

I have big DB. It's about 1 mln strings. I need to do something like this:

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

But it works very slow. I know that I can do it using "JOIN" syntax, but I can't understand how.

4

3 回答 3

5

试试这个方法:

select * 
from t1
left join t2 on t1.id1 = t2.id
where t2.id is null
于 2014-02-07T11:53:55.410 回答
2

首先,您应该优化两个表中的索引,然后您应该使用 join

于 2014-02-07T11:55:27.457 回答
0

dbms 可以通过不同的方式处理此任务:

它可以从 t2 中选择 id2,然后选择 id1 不在该集合中的所有 t1。您建议使用 IN 子句。

它可以从 t1 中逐条选择记录,如果在 t2 中找到匹配项,则查找每条记录。您会建议使用 EXISTS 子句。

您可以外部加入表,然后丢弃所有匹配项并保留不匹配的条目。这可能看起来很糟糕,尤其是当有很多匹配项时,因为您会获得大量的中间数据,然后将大部分数据丢弃。但是,根据 dbms 的工作方式,它可能会相当快,例如当它应用散列连接技术时。

这一切都取决于表大小、匹配数、索引等,以及 dbms 对您的查询的影响。有些 dbms 能够完全重写您的查询以找到最佳执行计划。

说了这么多,你可以尝试不同的事情:

  • 带有 (SELECT DISTINCT id2 FROM t2) 的 IN 子句。DISTINCT 可以显着减少中间结果并真正加快您的查询速度。(但也许你的 dbms 无论如何都会这样做以获得一个好的执行计划。)
  • 使用 EXISTS 子句,看看是否更快
  • Parado 建议的外连接
于 2014-02-07T12:12:02.553 回答