select djh from jlczkj.tdqs_zd where djh  in (select djh from tddj_qsdc where lifecycle='0' )可以执行select djh from jlczkj.tdqs_zd where djh  not in (select djh from tddj_qsdc where lifecycle='0' )却一直是正在执行

解决方案 »

  1.   

    如果tdqs_zd的数据量较大的话,执行效率会比较低
      

  2.   

    最好别用 not in   用 not exists代替
      速率要快很多
      

  3.   

    数据量大时最好使用exists
    1、select a.djh from jlczkj.tdqs_zd a where exists  (select 1 from tddj_qsdc b where b.lifecycle='0' and b.djh =a.djh ) 2、select a.djh from jlczkj.tdqs_zd a where not exists  (select 1 from tddj_qsdc b where b.lifecycle='0' and b.djh =a.djh ) 
      

  4.   

    表的数据很大的时候,最好别使用 not in ,最好用not exists来代替
      

  5.   

    in可以分为三类: 
    1、形如select * from t1 where f1 in ('a','b'),应该和select * from t1 where f1 ='a' or f1='b' 或者 select * from t1 where f1 ='a' union all select * from t1 f1='b'比较效率
    2、形如select * from t1 where f1 in (select f1 from t2 where t2.fx='x'),其中子查询的where 里的条件不受外层查询的影响,这类查询一般情况下,自动优化会转成exist语句,也就是效率和exist一样。 
    3、形如select * from t1 where f1 in (select f1 from t2 where t2.fx=t1.fx),其中子查询的where 里的条件受外层查询的影响,这类查询的效率要看相关条件涉及的字段的索引情况和数据量多少,一般认为效率不如exists。 除了第一类in语句都是可以转化成exists 语句的,一般编程习惯应该是用exists而不用in. 
      

  6.   

    一直在执行是因为sql还没有执行完,not in效率比较低,lz还是用not exists吧