多线程优化无效(其中一个线程执行10秒导致)

尽量避免循环写sql,row_number 实际基本应用

一、原来sql

java 复制代码
    // 原来是 t1 表和t2 表关联,查t1的code,同时要是t2 表某个属性xx 降序后取一个
    String sql ="    SELECT t1.*, t2.xx, " +
            "    FROM table1 t1 " +
            "    LEFT JOIN table2 t2 ON t1.id = t2.table1_id " +
            "    WHERE t1.code = '{}' order by t2.xx desc fetch first 1 rows only ";
//    在循环中写sql
    for(YourObject item : objectList){
        String code = item.getCode();
        Map<Stirng,Object> resultMap = getSqlMapper().selectOne(strUtil.format(sql,code));
//        查出结果继续别的处理
    }

二、优化后sql

java 复制代码
    public void processWithRowNumber(List<YourObject> objectList) {
        if (objectList.isEmpty()) return;
        
        Set<Long> codeSet = objectList.stream()
            .map(YourObject::getCode)
            .collect(Collectors.toSet());
        
        String inClause = codeSet.stream()
            .map(String::valueOf)
            .collect(Collectors.joining(","));
        
        // 使用ROW_NUMBER()为每个ID分组,取最新的一条
        String sql = "SELECT * FROM (" +
                     "    SELECT t1.*, t2.xx, " +
                     "           ROW_NUMBER() OVER (PARTITION BY t1.id ORDER BY t2.xx DESC) as rn " +
                     "    FROM table1 t1 " +
                     "    LEFT JOIN table2 t2 ON t1.id = t2.table1_id " +
                     "    WHERE t1.code IN (" + inClause + ")" +
                     ") WHERE rn = 1";
        
        List<Map<String, Object>> results = sqlMapper.selectList(sql);
        
        // 构建映射关系
        Map<Long, Map<String, Object>> resultMap = results.stream()
            .collect(Collectors.toMap(
                result -> ((Number) result.get("CODE")).longValue(),
                result -> result
            ));
        
        // 处理结果
        for (YourObject obj : objectList) {
            Map<String, Object> result = resultMap.get(obj.getCode());
            if (result != null) {
                processSingleResult(obj, result);
            }
        }
    }

三、总结

这是row_number 实际基本应用(用于优化sql放在循环外)

将sql拿出循环就是 用row_number() over()原因

之前博客记录 row_number用法 Row number 函数用法

实际项目使用过 row_number 实际基本应用

相关推荐
人道领域1 小时前
Day | 11 【苍穹外卖统计业务的实现:含详细思路分析】
java·数据库·后端·苍穹外卖
xiaoye37086 小时前
Java 自动装箱 / 拆箱 原理详解
java·开发语言
YDS8297 小时前
黑马点评 —— 分布式锁详解加源码剖析
java·spring boot·redis·分布式
ZTLJQ7 小时前
数据的基石:Python中关系型数据库完全解析
开发语言·数据库·python
迷藏4947 小时前
**发散创新:基于 Rust的开源权限管理系统设计与实战**在现代软件架构中,**权限控制**早已不
java·开发语言·rust·开源
升鲜宝供应链及收银系统源代码服务8 小时前
《IntelliJ + Claude Code + Gemini + ChatGPT 实战配置手册升鲜宝》
java·前端·数据库·chatgpt·供应链系统·生鲜配送
daidaidaiyu8 小时前
Nacos实例一则及其源码环境搭建
java·spring
跟着珅聪学java8 小时前
js编写中文转unicode 教程
前端·javascript·数据库
小江的记录本8 小时前
【Redis】Redis全方位知识体系(附《Redis常用命令速查表(完整版)》)
java·数据库·redis·后端·python·spring·缓存
摇滚侠8 小时前
Java 项目《谷粒商城-1》架构师级Java 项目实战,对标阿里 P6-P7,全网最强,实操版本
java·开发语言