基于ASP处理数据库的优化问…

Microsoft Active Server Pages 即我们所称的 ASP ,其实是一套微软开发的服务器端脚本环境, ASP 内含于 IIS之中 , 通过 ASP 我们可以结合 HTML 网页、 ASP 指令和 ActiveX 元件建立动态、交互且高效的 WEB 服务器应用程序。有了 ASP 你就不必担心客户的浏览器是否能运行你所编写的代码,因为所有的程序都将在服务器端执行,包括所有嵌在普通 HTML 中的脚本程序[1]。
ASP 能快速执行你的动态网页,但你还需要通过紧缩代码和数据库连接以使它们执行更快,因为一旦用户发现任何页面延迟都可能意味着他们会失去继续访问你的网站的耐心;假如你的是商业站点,这就可能意味着失去潜在的销售。本文在此只讨论Asp 在处理数据库如何获得最快执行速度的问题。
一、设计数据库时要注意的问题
1)确认你的数据库具有索引,因为这样能直接提高你的程序的效率。同样,尽量在你的数据库服务器运行更新统计(Update Statistics) 以帮助追踪你的数据分发,这样,你的数据库就能够基于这些信息来改造查询执行。
但是并不是在任何情况下使用索引都是最佳的,合理的索引设计要建立在对各种查询的分析和预测上,一般我们可以这样认为[2]:
①.有大量重复值、且经常有范围查询(between, >,< ,>=,< =)和order by、group by发生的列,可考虑建立群集索引;
②.经常同时存取多列,且每列都含有重复值可考虑建立组合索引;
③.组合索引要尽量使关键查询形成索引覆盖,其前导列一定是使用最频繁的列。
2)尽可能使用存储过程:存储过程是预先编译的程序,含有一个已经准备好的执行计划,所以比SQL语句执行更快。特别是要输出的数据要从存储过程来,通过存储过程访问数据库来代替使用嵌入式Sql 语句,你可以提升潜在的性能。同时在存储过程中让SQL象它被设计的那样工作,它能count(统计),连接(join), 排序(sort)和group 数据。当你能够写出一个查询语句来做这些东西的时候,就不要自己用其它语言来实现,例如:SELECT count(*) FROM Member WHERE state=’Grade’。
3)注意一些数据库比如MS Access,在设计自己的商业网站时,尽量不要考虑; SQL Sever 7.0或者Oracle是一个更好的选择。
4)多表操作的时候注意连接条件的考虑:多表操作在被实际执行前,查询优化器会根据连接条件,列出几组可能的连接方案并从中找出系统开销最小的最佳方案。所以连接条件要充份考虑带有索引的表、行数多的表;内外表的选择可由公式:外层表中的匹配行数*内层表中每一次查找的次数确定,乘积最小为最佳方案。
二、连接数据库时要注意的问题
1)使用快速的OLEDB Provider技术连接你的数据库而不是使用DSN连接。你的ADO调用首先被送到OLEDB,接着被送到ODBC层。然而,你可以直接连接到OLEDB 层,并且如果你这样做的话,你就能看到服务器端性能的提高[3]。
在连接数据库时还要记住每次数据库连接串参数必须相同,否则会被认为是不同的连接而重新去连接数据库,而不是使用缓冲池中的连接。最好的做法是将连接串存储在Application变量中,所有的程序在建立连接时使用Application变量的值。
同时显式创建连接对象: Set conn=Server.CreateObject(“Adodb.connection”)和建立数据库连接:conn.open Application(“connection_string”),因为隐式使用数据库连接时不能利用缓冲池的机制。
2)使用适当的光标和锁定模式。如果所做的全部工作只是从记录集中读取数据,并将其显示在屏幕上,那么就使用缺省的只能前移、只读的记录集。ADO用来维护记录和锁定的细节的工作越少,执行的性能就越高。
3)在读取数据库内容的处理中,使用Rs.GetRows()的速度最快,其次是Set Rs(字段编号)方法。GetRows()的优势,在于将查询到的资料以数组记录到内存中,并可随即将Recordset关闭释放。因此,当我们要某字段资料时,不需透过Recordset的接口去取得,而直接使用内存数组内的资料,要知道,Recordset是很耗系统资源的,越少使用越好,这方法之所以有效率就是这原因。
使用数组记录所有资料结果固然是最佳方法,但这只限于读取多笔资料时,倘若只有少数几笔资料时,数组法执行效率上便不及Set Rs(字段编号)方法了。因为使用Recordset接口读取下一笔资料,便要用Re.MoveNext让读取的光标移到下一笔资料所在,这方法要占用系统资源去运算才可达成,比起数组直接呼叫内存,方法当然慢的多。但若只有几笔资料,也仍然要多占内存和CPU去建立数组,再大费周章的将所有数据取出放入其中,这样效果还远不如使用几次Rs.MoveNext来达成少数资料的读取。
4)多用Set来处理数据库连接。只要多用Set就比其它同类方法速度还快。上面说过,我们要少用到Recordset便可提高速度。我们使用Set将各字段的属性内容,取出放入内存中再行读取,速度比直接操作Recordset接口更快。
5)要时刻注意 ADO对象是非常消耗资源的,因此一定要牢牢记住,只在用到ADO对象时才创建,用完后马上释放:rs.close和set rs=nothing
三、asp代码在处理数据库时要注意的问题
  1)在打开一个数据表的时候仅选择所需的列:当打开ADO记录集时,除非需要获得所有的列,否则不应自动地使用表名(即SELECT *)。使用单独的列意味着将减少发送到服务器或从服务器取出的数据量。即使需要使用全部列,单独地命名每个列也会获得最佳的性能,因为服务器不必再解释这些列的名字[4]。
2)当遍历记录集时一个肯定能提高性能的方法是使用对象变量指向集合中的成员。
While Not Rs.EOF 
Response.Write "名称:" & Rs ("M") & "(代码:" & Rs ("C") & ")" 
Rs.MoveNext
Wend
可以用改写为下面的代码以加快执行:
set Mc=RsGc("M") 
set Code=Rs ("C") 
While Not rs.EOF Response.Write "名称:" & Mc & "(代码:" & Code & ")"
Rs.MoveNext 
Wend
新的代码建立了对象变量的引用,所以可以使用对象变量而不是实际的变量,这意味着脚本引擎的工作减少了,因为在集合中进行索引的次数变少了。
3)尽量避免使用可更新 Recordset:
Rs=Conn.Execute("SELECT * FROM Member WHERE ID=1",3,3)
Rs("Name")=" DarkMan "
Rs.Update()
可以用:strSQL = "UPDATE Member SET Name=’DarkMan’ WHERE AuthorID=1"
Conn.Execute strSQL
4)使用数字序列:在ASP程序中,从诸如RecordSet中读取数据时,为了方便,常使用数据库列名的方式进行: Response.write rs(“Name”) 
而很少采用该数据库列名所在的数字序列来读取,即:Response.write rs(1)
其实,为了从RecordSet得到列值,ADO必须将列名转化为数字序列,因此,若直接使用数字序列,则可以提高读取速度。若感觉使用数字序列后,程序可读性不直观,可以采用建立常量的方法,如定义:const Name 1,这样就保证了程序的可读性和读取速度。
5)使用Response.Write 语句来替代内联ASP标记。在很多时候我们为了写代码的方便和考虑程序代码的可读性,都是采用”<%=rs(“name”)%>”这样的内联ASP标记来得到数据表的数据。但事实上这样读取数据的效率是很低的,我们可以使用Response.Write 语句把Html代码和ASP代码封装在一起,如:Response.Write("< tr >< td >< b >First Name:< /b >< /td >< td >" & FirstName & "< /td >< /tr >"),这样可以大大提高代码执行的效率[2]。
以上是本文从数据库建立、数据库连接和数据库读取代码的处理三个方面来考虑如何优化,从而提高数据库处理速度,最终使得网站的访问效率得到最大化的保障。当然,我们在代码设计的时候还有很多的技巧和数据库处理相结合,比如函数的使用、变量和语句的封装、页面之间的合理配置和SESSION的正确使用等等。只有合理的结合在一起,才能真正设计出高质量的网站。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值