编程小技巧(一)——系统性能优化之多次数据库访问处理
在我们日常工作中,总会遇到一个查询功能需要对首次查询结果进行二次甚至是多次处理才能得到最终需要的数据的情况。先不谈如何避免这种情况,这里只说一下出现这种情况的处理办法。
假设存在以下场景:存在订单表OrderInfo和订单扩展表OrderInfoExtend,因为某种特殊原因,不能够在一次SQL查询将两个表进行关联查询,需要先查询OrderInfo,然后根据Id查询OrderInfoExtend表的数据,最后再组装成需要的数据,那么大概会有以下代码:
1 var listOrderInfo=Query("OrderInfo"); 2 3 foreach(var item in listOrderInfo) 4 5 { 6 var extendModel=QueryOrderInfoExtendForId(item.Id); 7 item.ExtendInfo=extendModel?.ExtendInfo; 8 }
从逻辑上来说没有问题,也能够正常查询出来数据,但是假设listOrderInfo的记录有1000条,每次查询OrderInfoExtend的时间在50ms,那最终查询到结果的时间大致就是50ms*1000=50000ms=5s。并且这个时间会随着记录的增多或者循环内部调用查询的时长的增加而增长,最终给用户的体验就是查询数据特别的慢。
实际上对这个问题进行分析会发现,主要耗时在于循环的时候每次都需要进行一次连接数据获取数据的步骤,如果减少数据获取的次数,就可以解决耗时的问题。那么可以调整如下:
1 var listOrderInfo=Query("OrderInfo"); 2 3 var ids=BuildIds(listOrderInfo); 4 5 var extendList=QueryOrderInfoExtendForIds(ids); 6 7 foreach(var item in listOrderInfo) 8 9 { 10 var item.ExtendInfo=extendList.Where(o => o.OrderId == item.Id).FirstOrDefault()?.ExtendInfo; 11 }
这样将原有的循环获取改为只执行一次数据库获取,相当于整个获取步骤只执行了两次数据库操作,大大提高了数据查询速度。