首页 > 代码库 > 等价谓词重写
等价谓词重写
1、like规则
name like ‘abc%‘
重写为
name >= ‘abc‘ and name <‘abd‘
可以避免全表扫描,走索引
2、between-and规则
sno between 10 and 20
重写为
sno >= 10 and sno <=20
如果数据库对between-and走索引,改为这种可以从全表扫描转为索引扫描
3、in转or规则
age in (8,12,21)
重写为
age =8 or age=12 or age=21
如果数据库对in只支持全表扫描的话,这种转换可以走索引
4、in转any规则
age in(8,12,21)
转
age any(8,12,21)
5、or转any规则
sal > 1000 or dno =3 and(sal>1100 or sal>base_sal+100) or sal>base_sal+200 or sal>base_sal*2
重写为
dno = 3 and (sal>1100 or sal>base_sal+100) or sal>any(1000,base_sal+200,sal>base_sal*2)
6、all/any转集函数规则
sno > any(10,2*5+3,sqrt(9))
转换为
sno > sqrt(9)
7、not规则
not (col1 != 2)
转换为
col1 = 2
正面的重写速度更快
8、or重写并集规则
select * from student
where (sex=‘f‘ and age>15) or age>18
重写为
select * from student
where sex=‘f‘ and age>15
union
select * from student
where age>18
可以分别利用sex和age上的索引
总结:
上面都不是绝对的,要看数据库是否支持,如果数据库支持了,自己也就不用这样去等价谓词重写了。