热门标签 | HotTags
当前位置:  开发笔记 > 后端 > 正文

多张大表数据关联查询报表需求优化

一、需求描述:“电商拣货管理”筛选出状态为生效,面单号为空的,并且创建时间离查询时间半小

一、需求描述:

“电商拣货管理”筛选出状态为生效,面单号为空的,并且创建时间离查询时间半小时以外的,需要ID,拣货单号,相关单号,创建时间,然后通过拣货单号关联到“外部接口报文”的关键信息(模糊关联,关键信息后面多两个数),取到响应内容,如果在下行报文通过拣货单号查不到对应的条文则通过“电商拣货管理”的相关单号关联“异步任务”的实体序号取出状态为失败的日志的异常内容,两个都匹配不到的也需要查询出来。

二、解读需求涉及表:

  1. 拣货单管理表

  2. 面单管理表

  3. 外部接口报文

  4. 异步任务日志表

三、数据信息

  1. 拣货单管理表与面单管理表相关性,取出面单号为空的数据(小心使用 where … is null,走不了索引 );

  2. 没有面单的拣货单信息,作为子查询,查询“外部接口报文表”相关数据;此处关联情况是近似关系,可以进行对外部接口报文表相应字段进行字段截取匹配,然而截取字段会使查询不走索引;

  3. 拣货单信息作为子查询,作为“异步任务日志表”查询条件;

  4. 原数据关联4张表,一次性进行拼接关联查询,测验单条数据查询,检测结果较慢,需要90s的情况,因此业务运用层面不能简单走一条SQL的方法。

四、工具选择

  1. 直接SQL报表有一定的风险,优化SQL费时费力,见效低;(不考虑)

  2. 拆分SQL查询,运行程序方程式逐步查询的方式,每步都走索引的方法,在模糊查询的地方,使用单条循环查询,like (左近似) '条件值%';(考虑借助熟悉的VBA+oracle方法)

五、代码呈现

六、代码分步情况
1.先按时间段选取时间后,再查询拣货单数据,减少Oracle负载,数据搬移至EXCEL(小心数据量大于2的32次方1048576行)

    

2.提取无面单数据

3.循环方法逐条查询数据

   4.在整个拆分的程序查询情况

运行的时效含EXCEL本地数据存储读写等方法,运行时效从原一条SQL跑出结果花费90s,优化为2s出结果;

七、小结

在SQL查询方法上,优先考虑一条SQL执行完成,减少反复数据库读写的交互。而本例中,涉及的4张表均为业务大表,查询只能走索引的方法,字段处理能使用正则表达式则使用正则表达式,将索引列加入运算再进行查询,是无法走索引,且严重影响数据结果呈现,属于亟待优化的SQL方法。由于本例业务需求上允许使用简单快捷的找出需求报表即可,因此,以VBA工具为切入点,优先将需求数据通过变通的方法快捷呈现,以减少因优化SQL费时费力,还影响业务运营,又因为此数据类型属于系统异常时才有可能出现,使用频率不会特别高,但出现异常时排查又比较麻烦,因此选择的方法就是变通、快捷、开发量小,也只有VBA符合这几种特性。



推荐阅读
author-avatar
帅哥刘常胜
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有