记一次工作中SQL 的FULL JOIN 优化过程
在完成同事交接的一个项目需求迭代的时候,发现了有一段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秒左右,明显提升了查询的性能。
|