对tb_zjls 和tb_zjls_alt 表中的yybdm,fsrq,lsh建一个复合索引。

解决方案 »

  1.   

    create index ix_tb_zjls on tb_zjls(yybdm,fsrq,lsh);
    create index ix_tb_zjls_alt on tb_zjls_alt(yybdm,fsrq,lsh);
      

  2.   

    在select子句中没有必要将列名选出,这样也可能影响性能.
    delete from tb_zjls t 
       where exists (select 1
                     from tb_zjls_alt d 
                     where d.yybdm = t.yybdm 
                      and  d.fsrq  = t.fsrq
                      and  d.lsh   = t.lsh) 上面是一个相关子查询,你可以试着将它改为不相关子查询:
    delete from tb_zjls 
       where (yybdm, fsrq, lsh) in ( select   yybdm, fsrq, lsh
                                     from     tb_zjls_alt
                                     group by yybdm, fsrq, lsh )
      

  3.   

    delete from tb_zjls t 
       where exists (select 1
                     from tb_zjls_alt d 
                     where d.yybdm = t.yybdm 
                      and  d.fsrq  = t.fsrq
                      and  d.lsh   = t.lsh) 
    应该是比较好的办法。另外,索引也要都建上。
      

  4.   

    楼上各位: 由于tb_zjls和tb_zjls_alt上主键都是由yybdm,fsrq,lsh组成,因此,复合索引已经建立了。即如果再执行create index ix_tb_zjls on tb_zjls(yybdm,fsrq,lsh);
    create index ix_tb_zjls_alt on tb_zjls_alt(yybdm,fsrq,lsh);将提示:ORA-01408: 此列列表已经过索引