表关联的一点优化
情况是这样的:
DBA找上们来,说我们的SQL扫全表了,执行效率不高,需要优化一下。
SQL的结构大概是这个样子:
select *
from A left join B
on A.num = B.num
where A.confirm_time > ?
and A.confirm_time < ?
A的num,B的num,A的confirm_time是有索引的。数据库是DB2
执行计划看出B是扫描了全表的,这也是DB2比较奇怪的地方,它会按照自己想法走,就是不喜欢num这个索引。。。
查看B表,B表的create_time是有索引的,于是优化
select *
from A left join B
on (A.num = B.num and B.create_time>? and B.create_time<?)
where A.confirm_time > ?
and A.confirm_time < ?
原来执行80秒的SQL,现在执行3秒。
网上找到了一个图
on里面关于副表的条件会先生效,这也是上面SQL用时大幅度减少的原因,通过create_time过滤掉了大部分数据以后才联表。
据我观察,on条件里面关于主表的条件没有什么作用,传说也能提高一些效率,但那只是传说。