一SqlDataRead和Dataset的选择
Sqldataread优点读取数据非常快如果对返回的数据不需做大量处理的情况下建议使用SqlDataReader其性能要比datset好很多缺点直到数据读完才可close掉于数据库的连接
(SqlDataReader读数据是快速向前的SqlDataReader类提供了一种读取从SQLServer数据库检索的只进数据流的方法它使用SQLServer的本机网络数据传输格式从数据库连接直接读取数据DataReader需及时显式的close可及时的释放对数据的连接)
Dataset是把数据读出缓存在内存中缺点对内存的占用较高如果对返回的数据需做大量的处理用Dataset比较好些可以减少对数据库的连接操作优点只需连接一次就可close于数据库的连接
*一般情况下读取大量数据对返回数据不做大量处理用SqlDataReader对返回数据大量处理用datset比较合适对SqlDataReader和Dataset的选择取决于程序功能的实现
二ExecuteNonQuery和ExecuteScalar
对数据的更新不需要返回结果集建议使用ExecuteNonQuery由于不返回结果集可省掉网络数据传输它仅仅返回受影响的行数如果只需更新数据用ExecuteNonQuery性能的开销比较小
ExecuteScalar它只返回结果集中第一行的第一列使用ExecuteScalar方法从数据库中检索单个值(例如id号)与使用ExecuteReader方法返回的数据执行生成单个值所需的操作相比此操作需要的代码较少
*只需更新数据用ExecuteNonQuery单个值的查询使用ExecuteScalar数据绑定的选择
三数据的绑定DataBinder
一般的绑定方法<%#DataBinderEval(ContainerDataItem"字段名")%>用DataBindereval绑定不必关心数据来源(Dataread或dataset)不必关心数据的类型eval会把这个数据对象转换为一个字符串在底层绑定做了很多工作使用了反射性能正因为使用方便了但却影响了数据性能来看下<%#DataBinderEval(ContainerDataItem"字段名")%>当于dataset绑定时DataItem其实式一个DataRowView(如果绑定的是一个数据读取器(dataread)它就是一个IdataRecord)因此直接转换成DataRowView的话将会给性能带来很大提升
<%#ctype(ContainerDataItemDataRowView)Row("字段名")%>
*对数据的绑定建议使用<%#ctype(ContainerDataItemDataRowView)Row("字段名")%>数据量大的时候可提高几百倍的速度使用时注意方面需在页面添加<%@Importnamespace="SystemData"%>注意字段名的大小写(要特别注意)如果和查询的不一致在某些情况下会导致比<%#DataBinderEval(ContainerDataItem"字段名")%>还要慢如果想进一步提高速度可采用<%#ctype(ContainerDataItemDataRowView)Row()%>的方法不过其可读性不高
以上的是vbnet的写法在c#中<@%((DataRowView)ContainerDataItem)["字段名"]%>
对查看页面每个执行过程状态最简单的办法其页面的trace属性为true就可查看细节
一使用存储过程
性能方面存储过程提供了许多标准sql语言中所没有的高级特性其传递参数和执行逻辑表达式的功能有助于应用程序设计者处理复杂任务另外存储过程存储在本地服务器上减少了执行该过程所需的网络传输宽带和执行时间(存储过程已经对sql语句进行了预编译所以其执行速度比在程序里执行sql语句快很多)
程序结构方面从程序的可扩展性看使用存储过程会对程序以后的修改带来方便比如数据库的结构改变了只需修改相对应的存储结构和程序中的调用部分即可这部分不属于本文探讨范围属于程序结构设计方面所以不在此展开
程序安全性使用存储过程可避免SQLInjection攻击
二查询语句的优化(针对sqlserver)
很多人只为目的写出sql语句而不考虑sql语句的执行效率在这我只提供一优化表顺序的方法(sql语句的优化和原则将会在我的sqlserver学习笔记中专题讨论)
对sql语句执行效率可用sqlserver的查询分析器来查看语句的执行过程
优化表顺序一般情况下sqlserver会对表的连接作出自动优化例如selectnamenofromAjoinBonAid=BidjoinConCid=Aidwherename=’wang’
尽管A表在From中先列出然后才是B最后才是C但sqlserver可能会首先使用c表它的选择原则是相对于该查询限制为单行或少数几行就可以减少在其他表中查找的总数据量绝大多数情况下sqlserver会作出最优的选择但如果你发觉某个复杂的联结查询速度比预计的要慢就可以使用SETFORCEPLAN语句强制sqlserver按照表出现顺序使用表如上例加上SETFORCEPLANON……SETFORCEPLANOFF表的执行顺序将会按照你所写的顺序执行在查询分析器中查看种执行效率从而选择表的连接顺序
*使用SETFORCEPLAN选择表联结顺序
三页面的优化(aspx)
主要针对几个页面属性
EnableViewState(页面的视图状态)如果无特殊要求设置为false使用ViewState每个对象都必须先序列化到ViewState中然后再通过回传进行反序列化因此使用ViewState是没有代价的尽量减少使用对象如果可能尽量减少放入ViewState中的对象的数目下面情况基本上可以禁用viewstate
()页面控件(ascx)
()页面不回传给自身
()无需对控件的事件处理
()控件没有动态的或数据绑定的属性值(或对于每个postpack都在代码中处理)
单个页面或每个页面都禁用ViewState如下所示单个页面<%@PageEnableViewState="False"%>每个页面在webconfig中<PagesEnableViewState="false"/>EnablesessionState保持默认值即可(如果页面用到sessionstate它才会占用资源)EnableViewStateMac如果无安全上的特殊要求保持默认值
Pagelayout页面布局模型建议使用Flowlayout(元素不带绝对定位属性添加)Gridlayout(绝对定位属性)由于采用绝对定位将会比Flowlayout生产更多的代码主要是控件的定位信息
项目发布的时候切记解除页面的Debug状态
Html语言的优化我的建议是熟练掌握Html/javaScript少用vsnet自动生产的代码它会自动生成一些无用的html代码
smartnavigation设置为true能让用户明显的感觉性能提高启用此属性后对客户端和服务端影响不大它能智能涮新需要涮新需涮新的部分
四控件的选择
Html控件和服务器控件的选择服务器控件带来的方便和功能上的实现是html控件所不能比拟的但是是以牺牲服务器端的资源来取得的我个人建议如果html控件达不到所要实现的功能而且和一些脚本语言(如javascrpt/vbscript)结合也不能实现的话才会选择服务器控件选择服务器控件后也尽量对其控件优化如取消一些页面状态等(具体看控件的优化)
服务器控件的选择主要针对几个常用数据控件说明一下
DataGrid自带最强大的数据显示控件内置了对数据的修改删除添加分页等很多实用功能如果你只需对数据显示的话尽量不要选择DataGrid(它把数据都存储在viewstate中)也不要使用自带的分页功能microsoft在自动分页的底层做了很多工作虽然使用方便了但性能开销大了
DataList比DataGrid功能少了很多但自定义性强了很多特有的多行数据显示给我们带来了很多方便DataGrid能实现的功能它基本能实现所以建议使用它
Repeater功能最少但自定义性非常强如果只需对数据显示建议使用由于减少了很多功能对服务器的性能带来消耗最小因此如果是对数据显示的话我基本上都是选择Repeater然后DataList最后DataGrid
*尽量选择html控件能在客户端实现的功能就在客户端实现(熟练掌握Javascript)减少服务器的压力数据控件选择顺序RepeaterDataListDataGrid
五服务器控件的优化
Viewstate
控件的viewstate与页面的viewstate基本是一致的用来保存控件的一些状态处理原则和处理页面的viewstate一样有兴趣的可以用Datagrid绑定数据测试下viewstate保存的数据量有多大它所保存的数据基本和Datagrid显示的数据量大小是等同的
Ispostpack
默认false需要产生事件的时候才需设置为true
控件的优化主要看你对此控件的熟悉情况对控件内部运作的原理越了解就会对其作出合适的优化
性能优化是三两句话说不清的我所写出的仅仅是冰山一角性能的优化是靠平时经验的积累和对程序的运作原理的不断认知
六异常问题
一般的问题没有必要使用异常比如在论坛中用户不存在用户密码不正确等问题因为实例化一个异常需要耗费大量的资源需要填充异常信息(异常类型抛出异常位置等)当然不是避免使用异常对于必要的异常处理还是处理的对于异常的原则是能不用就不用能用系统已有的异常的就不要生成自己的异常