FF002-去重后取Top N,需要几小时那么长时间吗? 几十毫秒行不行?

2024年 7月 1日 47.6k 0

有人反馈说付费合集的第一篇文章没有试读,不知道讲了啥, 我把题目做了个截图,如下:

FF002-去重后取Top N,需要几小时那么长时间吗? 几十毫秒行不行?-1

另外,此付费合集的计划是每周一篇, 实际速度会比这个快.

下面开始是本篇文章内容:

这个案例我曾经发在朋友圈(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稍复杂的情况, 优化方法也大不相同, 以后的文章会介绍.

     这里使用一张千万记录的表来做一个模拟,能够很直观看出改写前后的性能差别:

    相关文章

    Oracle如何使用授予和撤销权限的语法和示例
    Awesome Project: 探索 MatrixOrigin 云原生分布式数据库
    下载丨66页PDF,云和恩墨技术通讯(2024年7月刊)
    社区版oceanbase安装
    Oracle 导出CSV工具-sqluldr2
    ETL数据集成丨快速将MySQL数据迁移至Doris数据库

    发布评论