查询语句如下:select * from A join B on A.xx=B.xx where 
A.A1='111' and B.B1='222'
or (A.A1='111' and B.C1='333')
or (A.A2='444' and B.C1='333')每个语句分别用到AB表的2个字段,这些字段上都有单独的索引。把这三个条件单独查的话都会走索引,很快,但是加到一起查,虽然满足条件的结果只有1条,但是执行计划就变成了全表扫描,cost80000多,基本出不来。现在我改成3段union可以解决此问题,但我不明白为什么这么写不行?求解。

解决方案 »

  1.   

    多个or不就相当于in了么,in不是不走索引的么
      

  2.   

    select  
     * from A  , B where A.xx=B.xx and
    A.A1='111' and B.B1='222'
    or (A.A1='111' and B.C1='333')
    or (A.A2='444' and B.C1='333')
    改成这就能走索引了,但为什么还不清楚,希望有个有能来解释下。
      

  3.   

    表的访问方法是有优化器决定的,现在基本上是基于成本的优化器CBO,CBO在选择访问表的方法时,主要是根据统计信息来进行决策,不能单纯的说,写成这样怎么走索引,那样就不走索引,同样的SQL,换成数据不一样的表,可能执行计划不一样。
      

  4.   

    select * from A join B on A.xx=B.xx where 
    A.A1='111' and B.B1='222'
    union
    select * from A join B on A.xx=B.xx where 
    A.A1='111' and B.C1='333'
    union
    select * from A join B on A.xx=B.xx where 
    A.A2='444' and B.C1='333'这样肯定是走索引了,一般碰到这种情况 可以这么考虑~!