解决复杂问题的基本思路:先缩小问题的范围,再确定问题,最后解决问题。
本文也是使用一个真实的故事来说明如何解决问题。 跟第一篇的故事类似,都是很多顾问花了很长时间不能解决的问题。
今天的故事是一个性能问题,跟工作流审批有关。
问题现状: 销售订单需要有工作流进行审批,一旦提交审批后,流入下一级审批所需时间越来越久,系统刚上线速度还可以,上线一个月后速度开始慢下来,2个月后,几乎审批需要几个小时,非常影响发货效率。
技术描述:工作流审批不是标准的销售订单工作流,而是利用案例功能,在案例功能基础上开发增加了工作流审批。 问题出现后,合作伙伴动用了很多顾问去解决此问题,技术人员说工作流不会出问题,因为工作流的开发没有逻辑代码。
处理思路:
- 由于采用案例作为工作流的框架,所以首先怀疑案例是否能支持工作流,因为标准案例是不存在工作流的。经过大量的测试后发现没有问题,案例可以支持工作流。
- 跟踪代码,缩小范围。 在跟踪过程中,发现有一个方法会非常慢,基本可以定位此方法出了问题。
- 对有问题的方法进行认真阅读后发现是标准功能,没有任何定制,不会出问题。
- 再次对可疑方法进行Debug,发现方法主要处理Query中的数据,这个Query是销售订单相关的Query
- 联想到工作流是需要Query的,所以感觉定位应该是Query查数据慢
- 仔细检查Query的构造,构造没有问题,再细看,Query没有增加Relation。销售订单头和销售订单行之间做了笛卡尔积,应该是性能慢的主因。
- 将属性Relation设置为Yes,再测试,性能问题解决。
前面两个例子,都是看起来无从下手的复杂问题,技术调查起来也费劲,但是问题的解决都非常简单。这两个例子就很好的说明了复杂问题的思路,一定要先缩小问题的范围,排除一些保证正确的分支,一旦问题范围缩小到足够小,问题基本就解决了。