日期:2014-05-17  浏览次数:20767 次

删除一个表中两列均不在另一表中的记录
需求如下:user_info表中有电话号码nbr字段,call表中有主叫号码calling_nbr字段和called_nbr字段
要求删除call表中calling_nbr、called_nbr均不在user_info中的记录
user_info记录数量级十万,call记录数量级千万
如果使用

delete from call c 
where c.calling_nbr not in (select nbr from user_info) 
and c.called_nbr not in (select nbr from user_info);

会因为not in的全表扫描而效率低下甚至假死。
大概知道应该使用外连接代替not in,但不知道具体怎么去写,求高人指点
SQL

------解决方案--------------------
user_info.nbr必须有索引
delete /*+ parallel(a,32) */from call a
 where exists(select 1 
    from user_info b
   where b.nbr in (a.calling_nbr ,a.called_nbr)
  );


最好写个存储过程搞,飞快