你在a3字段上应该没有建立索引而引起了全表扫描,
当过滤条件不同,查询的可能有些差异,有的马上
就扫描到,而有的要扫描到表尾才能找到。
建议LZ建立索引,和把or条件的分两条语句写
用union all来连组合。

解决方案 »

  1.   

    SQL的写法要规范:
    not length(a.att2)>0写成:len(a.att2)=0
    not a.att2=a.a3写成:a.att2<>a.a3
    '1114853495640'=(select bcbs_gongwen.att1 from bcbs_gongwen where bcbs_gongwen.id=a.qid)换成exists如下:
    select a.*
     from wenjian_recive a,bcbs_gongwen b
     where a.a3='zhangsan' and ((len(a.att2)=0) or (a.att2<>a.a3))
       and a.a5=0 and a.n3 in (2,3)
       and exists(select * from bcbs_gongwen
                  where bcbs_gongwen.id=a.qid and bcbs_gongwen.att1='1114853495640')
     order by a.id desc
      

  2.   

    --建议楼主,好好利用查询计划,分析资源消耗,表扫描情况,索引利用情况,针对性去优化.
    --有一些常用的SQL写法也要注意,避免查询丢失索引的写法.