select *from a where exists(select 1 from b where a.id=b.did and b.mdd like '%杭州%')只要增加了 b.mdd like '%杭州%',速度就很慢,不加like,速度就快,我知道,用exists之后,索引失效,但这个又一定得用到,请教有什么办法解决?

解决方案 »

  1.   

    like确有这种情况,等其它高手解答!
      

  2.   

    貌似造成索引失效的不是exists,而是like啊
      

  3.   

    http://blog.csdn.net/szstephenzhou/article/details/7774558
      

  4.   

    问题不是在于exists
    你改成下面的也是一样慢,select a.* from a join b on a.id=b.did where b.mdd like '%杭州%'主要是like 这个开销比较大,你的b表有多少数据?mdd 字段是什么类型的 列长多少
      

  5.   

    用charindex也能达到相同效果,但不知效率如何,LZ可以测试下
      

  6.   

    charindex效率一样的低下 要想效率高就尽量避免使用 like '%%'这样的查询。
      

  7.   

    select *from a where exists(select 1 from b where a.id=b.did and b.mdd like '杭州%')
    不知需求可不可以这样。
      

  8.   

    测试了一下,的确有这种情况。对比2个语句的执行计划,发现 加上like的是40%,不加like的是60%,
    而实际执行时间是 加上like 是 不加like的一倍左右。 看来执行计划的百分比高并不一定就效率低。
      

  9.   

    我感觉表内联接应该效率更高些,但是不知道执行时间具体多少。
    试试看吧:
    select a.* from a
    inner join b on a.id=b.did
                 and b.mdd like '%杭州%'
      

  10.   

    like 的使用,两遍都是模糊的话,即使这个列上有索引,也不会走索引扫描,你看看是否可以改成 '杭州%'  或者用函数索引
      

  11.   

    like是全文遍历搜索,很慢,放在join中 会速度减速一倍。不建议使用,换个思路解决你的问题吧select a.* from a
    inner join (select * from b where mdd like '%杭州%' )as b on a.id=b.did