对于一个日访问量大且数据库单表记录数在十万数量级的Web应用程序,优化工作是非常有必要的。下面就结合前段时间对AnyP社区程序的优化工作,谈谈.Net Web应用程序优化的一些心得。
首先,Web程序方面的优化。
1、 尽可能地为页面“瘦身”。
“瘦身”途径一:去掉多余的空格;
我们在编写程序的时候,适当的缩进,有助于程序的阅读,但由缩进而生成的空格却会增大页面的大小。为了减小页面大小,我们可以在上传程序的时候,将页面上的部分由缩进引起的空格去掉(在开发阶段,缩进还是非常有帮助的,所以建议在开发完成上传的时候才去掉缩进)。比如在Repeater里面的<ItemTemplate></ItemTemplate>中的空格。
“瘦身”途径二:去掉无用的viewstat;
由于viewstat只在需要有postback的时候,才需用到,所以当一个服务器控件无需postback的时候,我们大可将它的viewstat设置为false;事实上我们很多页面是不需要viewstat的,比如纯粹是一个列表页,而像DataSet或者Repeater之类的控件,其产生的viewstat,多达几十K。
2、 减少不必要的数据库操作。
我们可以在本机测试的时候,一边浏览
网站,一边打开SQL-Server的事件探查器,查看该页面涉及到的数据库操作有哪些,是否都是必要的,哪些操作可以合并,把多次的连接数据库用一次连接来实现。
其次,SQL语句的优化
涉及到数据库操作的,尤其是数据库记录数庞大的情况,SQL的优化尤为重要。当我们怀疑是因为数据库操作而导致浏览速度缓慢的时候,可以打开SQL-Server的事件探查器,新建一个追踪,逐个检查数据库操作的duration,如果某一个(或几个)存储过程执行的duration特别的大(几百甚至上千),我们就可以重点对这几个存储过程进行改造。
那么怎样来改造呢,有几点可以值得参考。
1、建立索引。
当对一个字段进行条件查询的时候,建立索引与不建立索引,其花时是相差很远的(本文所指的均是对大容量的数据查询,下同)。建立索引,查询的速度会快很多。而索引又有聚集索引跟非聚集索引,至于该字段是建聚集索引还是非聚集索引,我们得根据该表的实际情况,和程序中对各个字段的查询情况来决定。(有关聚集索引跟非聚集索引,参考本文结尾的推荐文章)
2、采用高效的分页方法
分页往往是Web应用程序中不可少的一个环节,而分页又往往是个难啃的“骨头”,网上对分页方法的讨论亦非常的多。目前常见的几种分页形式有:临时表法,子查询法,游标法。有关分页方法的讨论,参考本文结尾的推荐文章)
3、尽量不要用Select *
小结
在优化AnyP社区程序的过程中,阅读了不少关于程序优化的文章以及书籍。.Net Web应用程序的优化,远不止如上所述的几种。鉴于时间原因和个人表达水平有限,下面列出在此次程序优化工作中所阅读过的部分文章和书籍,供大家参考:
微软出的 ScaleNet 一书(英文)
http://download.microsoft.com/download/a/7/e/a7ea6fd9-2f56-439e-a8de-024c968f26d1/ScaleNet.pdf
SQL优化:
http://blog.csdn.net/fly_miss/archive/2004/10/25/SqlUpdate.aspx
Paging of Large Resultsets in ASP.NET http://www.codeproject.com/aspnet/PagingLarge.asp
《ASP.NET高级编程》
CSDN社区的.Net版跟数据库版的部分文章