查询语句如下:
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'
这样肯定是走索引了,一般碰到这种情况 可以这么考虑~!