查询语句如下: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可以解决此问题,但我不明白为什么这么写不行?求解。
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可以解决此问题,但我不明白为什么这么写不行?求解。
* 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')
改成这就能走索引了,但为什么还不清楚,希望有个有能来解释下。
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'这样肯定是走索引了,一般碰到这种情况 可以这么考虑~!