我在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
。
你还有其他解决办法吗? 感谢
答案 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