有人反馈说付费合集的第一篇文章没有试读,不知道讲了啥, 我把题目做了个截图,如下:
另外,此付费合集的计划是每周一篇, 实际速度会比这个快.
下面开始是本篇文章内容:
这个案例我曾经发在朋友圈(2024-03-27), 到目前为止还没有人跟我讨论如何优化.
某mes系统,下面这个SQL执行了13603秒(3.8小时),消耗大量CPU和IO资源,业务不可接受,类似的sql还有多个:
--简化脱敏后的SQL如下:
--业务逻辑:取最大的20个waferid对应的记录(waferid有重复)
select *
from tbl_trace_wafertrace
where waferid in
(
select waferid
from tbl_trace_wafertrace ----17.8亿记录
group by waferid ----字段上有索引, NDV=201,424,896 1个waferid平均对应8.8条记录
order by waferid desc
FETCH NEXT 20 ROWS ONLY
);
平均返回 20*8.8 条记录
聪明的读者, 看到这里, 你能想到什么优化方法?
思考时间......
可能有人会想到使用分区和并行技术,水平高一些的可能想到了改写sql。
我跟你们想到的方法一样, 就是改写SQL. 改写后的SQL,只需要几十毫秒的执行时间.
上面这个SQL相对比较简单(没有其他谓词条件),我用两种方法来实现.
还有比这个SQL稍复杂的情况, 优化方法也大不相同, 以后的文章会介绍.
这里使用一张千万记录的表来做一个模拟,能够很直观看出改写前后的性能差别: