sql连接表与喜欢

时间:2014-02-28 08:26:42

标签: sql postgresql join sql-like

我在Postgres有两个表,有10.000.000行的电子邮件和有150.000行的spam_email。电子邮件表格由普通电子邮件地址组成,如“example@domain.com”,“example1 @ domain2.com”等,垃圾邮件表格包含“@ domain.com”,“@ domain1.com”等地址。

我想要做的是从电子邮件表中找到与spam_email表匹配的所有值。 我做的是这段代码:

Insert INTO clean_email(email) 
select distinct email 
from email e 
   join (select email from spam_email) se ON se.email not like s.email

但每次我收到错误disk out of space

你还有其他解决办法吗? 感谢

3 个答案:

答案 0 :(得分:1)

如果你的磁盘空间不足,那么你可能需要更多的磁盘空间;或者您可能需要配置postgresql以更好地利用可用资源:https://wiki.postgresql.org/wiki/Tuning_Your_PostgreSQL_Server

话虽如此,没有必要加入subselect,可能是使用资源进行临时表或排序,这是可以避免的。

您的查询无法以书面形式运行(没有名为s的表,因此s.email无法正确运行。

试试这个:

SELECT DISTINCT se.email FROM email e 
  JOIN spam_email se ON e.email NOT LIKE '%' || se.email;

它仍然是一个缓慢的查询计划;没有办法使用索引进行like '%' || se.email之类的查询,所以它会进行大量的表扫描。更好的方法是将域部分分成另一列并在其上放置一个索引(或者为它使用一个函数并在函数上放一个索引)。

答案 1 :(得分:0)

Insert INTO clean_email(email) 
select distinct email 
from email e 
   left join spam_email se ON se.email=e.email
where se.email is null;

答案 2 :(得分:0)

您正试图将èmail中的记录与not like电子邮件的每条记录进行匹配,这会产生大约10000000 x 150000条记录,从而使您的空间不足。

我认为下面的查询会更接近您想要完成的内容,假设spam_email存储'@domain1.com'等记录。

insert into clear_email(email)
select distinct
  e.email
from email e
inner join spam_email se on extract_domain_from_mail(e.email) = se.email