某工厂是生产数码产品金属外壳的,每天近100万件的产量,随着圣诞节的临近,客户订单大量增加,但是生产却跟不上,经初步分析,发现问题发生在激光雕刻二维码的工位,由于镭雕机从MES取号的时间太长,造成生产的瓶颈。
该厂MES的主要功能是做生产追溯,包括:生产过程记录、关键工位检查、质量问题收集等。
在镭雕工位,客户端程序要从MES中查询得到对应机型的最小序列号,然后传给镭雕机。
查询SQL的核心逻辑为:
SELECT MIN(serial_number) FROM t_product_history t WHERE t.type = ‘PN1’ //产品类型 AND t.status = 1; //产品状态,1表示尚未镭雕 |
通过ORACLE AWR可以得到此查询SQL在某个时间段的总执行时间。
此外,我们可以查询得到SQL_TEXT的执行次数。
两者相除,就得到此SQL的平均时间:竟然达到2秒!
更糟糕的是,查看客户端代码后,发现没有做并发处理,当现场二十多台镭雕机同时工作时,工人一旦发现响应慢,就会不断点击手动请求按钮,造成多并发,进而造成查询的执行时间更长。
接下来只有认真地分析t_product_history这个表的业务。
这个表是一个产