首页 > 其他分享 >【编码技巧】批量校验或处理关联引用数据的优化总结

【编码技巧】批量校验或处理关联引用数据的优化总结

时间:2024-09-05 17:24:55浏览次数:9  
标签:编码 缓存 批量 校验 关联 导入 names SQL 数据

问题描述:

       之前有信创项目反馈了一个批量导入的性能问题,400条数据需要3分钟,5000条需要20分钟以上,系统初始需要导入的各类数据有上百万。

原因分析:

       联系项目导入20~30条数据,并启用程序跟踪收集性能数据发现,有大量对字典表的SQL查询。

       与功能开发同事沟通确认,该SQL是导入模板中有几个关联字段,用户录入的是编码或名称,后台需要根据编号或名称查询对应的Id值,目前是简单粗暴的循环处理。

       原因倒是很清楚,如果只是为了减少对关联字段的查询次数,可以直接一次将关联数据全部加载做缓存处理,前提是关联数据的全量数据不能太大,否则容易导致OMM。

优化方案:

       按列汇总所有数据并去重,建立当前关联列数据的Map<name, id>缓存,分批次去DB检索数据,并存入Map缓存:

       1、取出一个批次的数据 names(n=names.size(),  n<=500)

       2、检查Map缓存中是否已存在

            2.1、如果Map已缓存,就根据map直接标记检查结果,并从names移除该数据

            2.2、如果n<300,则再次执行第1步骤,直至n=300或当前列所有数据均已被处理

       3、select id, name from helpdata where name in (names);

       4、将name->id作为键值对加入map

       5、将names 与 nameList的差集,按 name –> null 加入map

       6、重新执行第1步骤,直至当前列所有数据被处理完毕

 

       此方案基于一个这样的事实:一次导入或处理的数据是相对有限的(一般而言,<=10w最多也不会超过50w,再多也是分成多个批次处理),而这一个批次中某列的关联数据有可能是百万乃至千万的量级。

       如果按行循环处理,需要循环rowNum * columnNum次,以10w行、20列引用字段为例,需要执行200w次SQL查询请求;

       如果一次将关联帮助数据全部加载至内存,则对于项目、往来等可能存在很大数据量的场景,会直接导致应用OOM;

       按照本方案,理论上最坏的情况也仅执行4k次SQL查询请求(10w行、20列),而真实场景是一次处理的数据中关联列字段值重复概率非常高,实际执行的SQL请求和内存占用远低于理论的最大值。

效果验证:

       产品功能按此方案优化,部署到项目后反馈良好:内存占用稳定,1k数据(2个关联列)处理响应时间从之前的3分钟提升至10秒左右。

       image

标签:编码,缓存,批量,校验,关联,导入,names,SQL,数据
From: https://www.cnblogs.com/zhaoguan_wang/p/18398908

相关文章

  • base64是什么,在 C# 中对 Base64 字符串进行编码和解码
    原文链接:https://blog.csdn.net/ty_oldman/article/details/116306785         https://blog.csdn.net/qq_55752792/article/details/139681358base64是什么Base64编码,是由64个字符组成编码集:26个大写字母AZ,26个小写字母az,10个数字0~9,符号“+”与符号“/”。Bas......
  • linux批量运维主机(二)
    Salt一种全新的基础设施管理方式,部署轻松,在几分钟内可运行起来,扩展性好,很容易管理上万台服务器,速度够快,服务器之间秒级通讯。salt底层采用动态的连接总线,使其可以用于编配,远程执行,配置管理等等。这比ansible的更有优势。下面安装saltstackUI界面。#卸载dockersudoyumrem......
  • 前端vue项目 git commit msg 文字校验实现,利用husky 和 commitlint实现
    husky安装使用说明husky作用是创建git钩子,然后触发命令执行安装yarnaddhusky初始化npxhuskyinit会出现下面文件夹commitlint安装和使用安装commitlintyarnaddcommitlint安装校验规则库@commitlint/config-conventionalyarnadd@commitlint/co......
  • python遍历之批量更改文件名
    遍历方式更改文件名importosimportsys#定义一个名字叫做rename的函数defrename(filePath):"""批量重命名指定路径下的'.dbf','.prj','.shp','.shx'格式的文件,重命名格式:文件_文件夹名字,并删除'.sbn','.sbx','.......
  • 一文教会你如何用好通义灵码,让这款 AI 编码工具帮你做更多工作,更高效
    通义灵码,是阿里云与通义实验室联合打造的智能编码辅助工具,提供行级/函数级实时续写、自然语言生成代码、单元测试生成、代码优化、注释生成、代码解释、研发智能问答、异常报错排查等能力,提供代码智能生成、研发智能问答能力。国际市场研究机构Gartner发布业界首个AI代码助手魔......
  • 一文教会你如何用好通义灵码,让这款 AI 编码工具帮你做更多工作,更高效
    通义灵码,是阿里云与通义实验室联合打造的智能编码辅助工具,提供行级/函数级实时续写、自然语言生成代码、单元测试生成、代码优化、注释生成、代码解释、研发智能问答、异常报错排查等能力,提供代码智能生成、研发智能问答能力。国际市场研究机构Gartner发布业界首个AI代码助手魔......
  • 一文教会你如何用好通义灵码,让这款 AI 编码工具帮你做更多工作,更高效
    通义灵码,是阿里云与通义实验室联合打造的智能编码辅助工具,提供行级/函数级实时续写、自然语言生成代码、单元测试生成、代码优化、注释生成、代码解释、研发智能问答、异常报错排查等能力,提供代码智能生成、研发智能问答能力。国际市场研究机构Gartner发布业界首个AI代码助手......
  • 一文教会你如何用好通义灵码,让这款 AI 编码工具帮你做更多工作,更高效
    通义灵码,是阿里云与通义实验室联合打造的智能编码辅助工具,提供行级/函数级实时续写、自然语言生成代码、单元测试生成、代码优化、注释生成、代码解释、研发智能问答、异常报错排查等能力,提供代码智能生成、研发智能问答能力。国际市场研究机构Gartner发布业界首个AI代码助手......
  • 该如何做参数校验
    该如何做参数校验技术架构springboot首先每一个接口都要有controllerservicemapper这种参数校验也是有很多种做法的,分享我的做法。那么入参是必须要做校验的比如实体类用Optional.ofNullableOptional.ofNullable是Java8引入的一个用于处理空值的类Optional中的一个静态......
  • (5-4-05)基于Stable Diffusion的文生图系统:(5)概率分布+编码和嵌入
    5.概率分布文件distributions.py定义了与概率分布相关的抽象类和具体实现,包括抽象分布类AbstractDistribution、狄拉克分布DiracDistribution和对角高斯分布DiagonalGaussianDistribution。这些类提供了样本生成、模式计算和KL散度等功能,支持概率模型中的采样和分布计......