在完成同事交接的一个项目需求迭代的时候,发现了有一段Full Join的代码执行比较慢。
其代码大概如下:
SELECt nvl(a.user_id,b.user_id) AS user_id, nvl(a.visit_num,0) AS visit_num, nvl(b.comment_num,0) AS comment_num FORM ( SELECT user_id, visit_num FROM user_visits ) AS a FULL JOIN ( SELECt user_id, comment_num FROM user_comment ) AS b ON a.user_id=b.user_id;
我现在要迭代一次需求,新增一张user_like表,如果照之前同事的思路,我直接在他原来的SQL代码中再加一段FULL JOIN就可以解决需求问题了,但是这样解决不了性能问题,随着我这次需求的迭代,执行时间只会更慢。
经过思考之后我采用了另一种方式重构了同事原来的代码,重构后的代码如下:
SELECt user_id, MAX(visit_num) AS visit_num, MAX(comment_num) AS comment_num FORM ( SELECT user_id, visit_num, 0 AS comment_num FROM user_visits UNIOn ALL SELECt user_id, 0 AS visit_num, comment_num FROM user_comment ) GROUP BY user_id;
分别观察这个两个SQL对应的执行JOB,如下图所示:
优化前:
优化后:
分别对优化前的SQL和优化后的SQL分别进行10次查询操作,取执行时长平均值。
发现优化前SQL执行平均时长是100s左右,优化后SQL执行平均时长是35秒左右,明显提升了查询的性能。



