首页 > 代码库 > 等价谓词重写

等价谓词重写

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上的索引


总结:

上面都不是绝对的,要看数据库是否支持,如果数据库支持了,自己也就不用这样去等价谓词重写了。