日期:2014-05-17  浏览次数:20649 次

多个or条件不走索引,求解
查询语句如下:

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可以解决此问题,但我不明白为什么这么写不行?求解。

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

这样肯定是走索引了,一般碰到这种情况 可以这么考虑~!