select top 10 * from ViewBgbh where 综合判定='/' and (报告编号 in (select 报告编号 from ViewJyxm where 结果!='')) and (报告编号 not in (select 报告编号 from ViewJyxm where 结果='')) order by 报告编号以上在sql2008中需2秒,有点长,有何优化方法(exists方法一样)

解决方案 »

  1.   

    sql似乎是矛盾的
    报告编号 in (select 报告编号 from viewjyxm where 结果!='')
    报告编号 not in (select 报告编号 from viewjyxm where 结果='')
    这两句的效果是一样的吧?
      

  2.   

    楼主的数据库结构设计的不好。书写代码坏毛病也多。常用与 where、 order 的字段尽量设计得值重复性少,select  * 不到非用不可别用它,筛选出有用的字段就行了。否则就是建立索引,还会多出个“键查找”的分支。ViewJyxm  表或者说Jyxm 表上 ,“报告编号”和 “结果”字段建立符合索引。ViewBgbh 表或者说Bgbh 表上,“综合判定”“报告编号”建立复合索引,考虑到 select 将要筛选字段,最好添加这些字段进入 索引覆盖里面。。
      

  3.   

    数据量小,根本看不出来。exists使用起来肯定效果好点。
      

  4.   

     exists 跟 in 速度是一样,大家作作试验就知道了,别光看网上瞎扯淡的优化。
      

  5.   


    不矛盾,viewjyxm中有同一报告编号有多条数据,结果有为空的也有不为空的,我需要的是全部不为空的,并且必须在viewjyxm存在,因此需要应用上述的sql
      

  6.   

    select top 10 a.* from ViewBgbh as a 
    inner join ViewJyxm as b on a.报告编号=b.报告编号 and a.综合判定='/' and b.结果!=''
    inner join ViewJyxm as c on a.报告编号<>b.报告编号 and a.综合判定='/' and b.结果=''
     order by 报告编号
    然后再加索引,少用in ,not in之类的。
      

  7.   

    别写sql了,改成存储过程吧!还有能够不用*的话,就别用!
      

  8.   

    改用存储过程吧,先取数据然后通过代码在处理
    思路就是先取所有结果不为空的(一次查询),再取所有结果为空的(第二次查询),然后再做一遍检查,去掉结果为空的你的sql重复查询次数太多了