Larry Yang

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

(原创,转载请注明)

最近我负责的物流网站接连遇到性能方面的问题,经过各种努力,总算解决掉了大部分的性能问题。想了想应该做一下阶段性的小结。在最近遇到的性能问题中,我发现主要有这样三类问题:

 

1. 非必要查询太多。

例子:

我们有一个循环总是很慢,后来定位到一个查询用户信息函数GetUserByName,这个函数消耗的时间明显要高于其他查询函数,每100次调用大概要花11秒钟。我去看了这个函数的实现方式,发现它不仅查询用户的基本信息,还要把用户的所有辅助信息从关联表中查询出来,这样一来就大大降低了查询效率。而且,这些辅助信息在循环中的根本不会被用到。

解决方案:

重新实现一个简单的GetUserForUpdate函数,在实现中仅仅查询用户的基本信息。这样,每次更新,都能省下了10几秒钟。

2. 数据表缺少必要的索引:

例子:

有一个页面总是超时,然后定位到一个linq的查询,这个查询非常之慢。尽管符合条件的数据只有两条,但每次查询需要消耗20多秒。后来,我用sqlprofiler把查询的Sql语句抓取出来。(当然,可以有别的办法快速获取linq自动产生的sql,这里就不做讨论了)。然后放在sql server里面看它的执行计划。然后,执行计划的结果提示:根据时间查询的那个字段需要建立索引。

btw: 那个表大概有80w条数据。

解决方案:

在时间字段上建立了一个聚集索引,然后,查询时间就从20多秒降到0点几秒。搞定~


3. 耗时较大的操作考虑重构为异步:

例子:

我们有一个循环效率很慢,后来发现在这个循环中的发送Email操作经常会失败,而且每次失败后等待抛异常都要等20秒钟左右。因为我们使用的是第三方的Email服务器,当每天的发送量比较大的时候,经常会出现发Email失败的现象。

解决方案:

鉴于这种问题不能通过数据查询优化来解决。我们只好把发Email的部分,做成了异步的操作:就是每次在自己数据库保存一条发送Email的记录。然后由另外一个计划任务定期执行,读取这些记录然后发送,这样一来,也就是发送email会延迟一段时间,同时又提高了业务循环的性能。

posted on 2012-03-10 09:52  Larry Yang  阅读(781)  评论(0)    收藏  举报