表关联的一点优化

情况是这样的:

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条件里面关于主表的条件没有什么作用,传说也能提高一些效率,但那只是传说。

原文地址:https://www.cnblogs.com/coolgame/p/9067679.html