delete from (
select u.nbr from user_info u left outer join call c on u.nbr=c.calling_nbr and u.nbr=c.called_nbr)x

解决方案 »

  1.   

    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)
      );最好写个存储过程搞,飞快
      

  2.   

    受你启发,我尝试delete /*+ parallel(c,32) */ from call c
    where exists(
    select /*+ parallel(c,32) */ 1  
    from call c
    left outer join (select certi_latn ce,acc_nbr from user_info) u1 on u1.acc_nbr=c.calling_nbr
    left outer join (select certi_latn ce,acc_nbr from user_info) u2 on u2.acc_nbr=c.called_nbr
    where u1.ce is null and u2.ce is null);执行计划来看要更快,但select count(*)后发现两个条件得到的行数不同,不知道问题出在哪里
      

  3.   

    其中certi_latn是user_info表中一个非空的字段
      

  4.   

    你exists里的查询和要delete的表貌似是不相关的,
    要么都删了,要么一条都没删除建议直接写个脚本,给你个模板,表有分区的话,一个分区跑一个很快的declare
      v_flag number;
      v_cnt number := 0;
    begin
      for v_cur in (select t.*,rowid row_id from call t) loop
        begin
          --满足条件的删除 v_flag := -1;
           v_cnt := v_cnt + 1;
           v_flag := 0;
           ...      if v_flag = 1 then
            delete from call when rowid = v_cur.row_id 
          end if;    
        exception when others then
          null;
        end;
        if v_cnt > 1000 then
           v_cnt := 0;
           commit;
        end if;
      end for;
      commit;
    end;