作者:帅哥刘常胜 | 来源:互联网 | 2023-08-04 08:38
一、需求描述:
“电商拣货管理”筛选出状态为生效,面单号为空的,并且创建时间离查询时间半小时以外的,需要ID,拣货单号,相关单号,创建时间,然后通过拣货单号关联到“外部接口报文”的关键信息(模糊关联,关键信息后面多两个数),取到响应内容,如果在下行报文通过拣货单号查不到对应的条文则通过“电商拣货管理”的相关单号关联“异步任务”的实体序号取出状态为失败的日志的异常内容,两个都匹配不到的也需要查询出来。
二、解读需求涉及表:
拣货单管理表
面单管理表
外部接口报文
异步任务日志表
三、数据信息
拣货单管理表与面单管理表相关性,取出面单号为空的数据(小心使用 where … is null,走不了索引 );
没有面单的拣货单信息,作为子查询,查询“外部接口报文表”相关数据;此处关联情况是近似关系,可以进行对外部接口报文表相应字段进行字段截取匹配,然而截取字段会使查询不走索引;
拣货单信息作为子查询,作为“异步任务日志表”查询条件;
原数据关联4张表,一次性进行拼接关联查询,测验单条数据查询,检测结果较慢,需要90s的情况,因此业务运用层面不能简单走一条SQL的方法。
四、工具选择
直接SQL报表有一定的风险,优化SQL费时费力,见效低;(不考虑)
拆分SQL查询,运行程序方程式逐步查询的方式,每步都走索引的方法,在模糊查询的地方,使用单条循环查询,like (左近似) '条件值%';(考虑借助熟悉的VBA+oracle方法)
五、代码呈现
1.先按时间段选取时间后,再查询拣货单数据,减少Oracle负载,数据搬移至EXCEL(小心数据量大于2的32次方1048576行)
2.提取无面单数据
3.循环方法逐条查询数据
4.在整个拆分的程序查询情况
运行的时效含EXCEL本地数据存储读写等方法,运行时效从原一条SQL跑出结果花费90s,优化为2s出结果;
七、小结
在SQL查询方法上,优先考虑一条SQL执行完成,减少反复数据库读写的交互。而本例中,涉及的4张表均为业务大表,查询只能走索引的方法,字段处理能使用正则表达式则使用正则表达式,将索引列加入运算再进行查询,是无法走索引,且严重影响数据结果呈现,属于亟待优化的SQL方法。由于本例业务需求上允许使用简单快捷的找出需求报表即可,因此,以VBA工具为切入点,优先将需求数据通过变通的方法快捷呈现,以减少因优化SQL费时费力,还影响业务运营,又因为此数据类型属于系统异常时才有可能出现,使用频率不会特别高,但出现异常时排查又比较麻烦,因此选择的方法就是变通、快捷、开发量小,也只有VBA符合这几种特性。