使用如下语句查询HZZXJSZLX表中HTH不在nc_is_collect表中的记录。HZZXJSZLX中有10多W条记录,而nc_is_collect表也有将近10W条记录。HZZXJSZLX 中HTH字段已经做过索引,nc_is_collect中FARMER_CD字段做过索引,但该SQL语句查询了将近20分钟还没出结果。请教对SQL语句的优化,提高查询速度。select * from hzzxjszlx where nd='2013'and htzt='2'and zfzt<>'2'and data_state='0' and hth not in (select farmer_cd from nc_is_collect where data_state='0'and nd='2013'
and audit_state='1'and is_collect='1' ) order by hth

解决方案 »

  1.   

    select a.*,b.farmer_cd from (select * from hzzxjszlx where nd='2013'and htzt='2'and zfzt<>'2'and data_state='0') a,(select farmer_cd from nc_is_collect where data_state='0'and nd='2013'
    and audit_state='1'and is_collect='1') b where a.hth=b.farmer_cd(+) and b.farmer_cd is null求给分
      

  2.   

    select * from hzzxjszlx 
    where nd='2013'
    and htzt='2'
    and zfzt<>'2'
    and data_state='0' 
    and not exists(select * from nc_is_collect 
    where data_state='0'
    and nd='2013'
    and audit_state='1'
    and is_collect='1' 
    and hzzxjszlx.hth=nc_is_collect.farmer_cd);
      

  3.   

    select a.* 
    from 
    hzzxjszlx a
    left join
    (select farmer_cd from nc_is_collect where data_state='0' and nd='2013' and audit_state='1' and is_collect='1' ) b
    on a.hth=b.farmer_cd
    where b.farmer_cd is null and nd='2013' and htzt='2'and (zfzt>'2' or zfzt<'2') and data_state='0'   
    order by hth;表关联最好用join,where条件中不要用<>,另外可以考虑修改一下表的字段类型