欢迎光临寒舍,

避免asp的SQL的执行效率低

上一篇 / 下一篇  2007-07-03 10:44:18 / 个人分类:asp+sql

避免asp的SQL的执行效率低

2007-07-03 09:32:39 / 个人分类:ASP

方法一、尽量使用复杂的SQL来代替简单的一堆 SQL.51Testing软件测试网(_(Oc2sx[
51Testing软件测试网+JMq"a9Y ?'C
同样的事务,一个复杂的SQL完成的效率高于一堆简单SQL完成的效率。有多个查询时,要善于使用JOIN。
Q1}l&O4R.x5Q105439oRs=oConn.Execute("SELECT * FROM Books")51Testing软件测试网5i-YM-X+jgL8Q
while not oRs.Eof
Cn;sV/F?'n/T%N]Dq105439strSQL = "SELECT * FROM Authors WHERE AuthorID="&oRs("AuthorID")51Testing软件测试网l7[r8Z(kA6x
oRs2=oConn.Execute(strSQL)51Testing软件测试网} a;k\G3UK9V
Response.write oRs("Title")&">>"&oRs2("Name")&"<br>&q uot;51Testing软件测试网1ryQtF,O
oRs.MoveNext()
ahF5Q0H3nj/J.z105439wend
\)AH/?W105439要比下面的代码慢:
a,Y9tq'_"NJ gr105439strSQL="SELECT Books.Title,Authors.Name FROM Books JOIN Authors ON Authors.AuthorID=Books.AuthorID"
M]#]kf0R*a105439oRs=oConn.Execute(strSQL)
9x5F9zj(Dk'G9c]i105439while not oRs.Eof
7IX~ @6M105439Response.write oRs("Title")&">>"&oRs("Name")&"<br>&qu ot;51Testing软件测试网i jSu CS,J9t"|2f
oRs.MoveNext()
)E}c\S"w105439wend
3`JOiZN10543951Testing软件测试网aO,SE W
方法二、尽量避免使用可更新 Recordset
1D,K#T^qj9zxDr105439
5V%D`LR2J105439oRs=oConn.Execute("SELECT * FROM Authors WHERE AuthorID=17",3,3)
qkaMr6m_9mc}(i105439
Ys&L?5wz`105439oRs("Name")="DarkMan"
A s1}7g8_U+w105439
9h6w;W7w[Wl105439oRs.Update()51Testing软件测试网-k-sf[zn

]g6Z!~ `!s f10543951Testing软件测试网5Su:YF!a
要比下面的代码慢:
"EoUN0wP.E&Kn.V%^W'Y105439strSQL = "UPDATE Authors SET Name='DarkMan' WHERE AuthorID=17"
3_A/p_v!ih7uB9BJ105439oConn.Execute strSQL51Testing软件测试网#Sm%h'r)dj[
51Testing软件测试网,Np:q6FCB
方法三、更新数据库时,尽量采用批处 理更新
BFU7ul-o5^%XD10543951Testing软件测试网-J%u\'n!wo'H ? c
将所有的SQL组成一个大的批处理SQL,并一次运行;这比一个一个地更新数据要有效率得多。这样也更加满足你进行事务处理 的需要:
*| t.t\+j[nxeX105439strSQL=""51Testing软件测试网e(r[7l$B|R6j#wl7A
strSQL=strSQL&"SET XACT_ABORT ON\n";
RO'N8vo+Os$^105439strSQL=strSQL&"BEGIN TRANSACTION\n";51Testing软件测试网Igx{v ]9Qi0l
strSQL=strSQL&"INSERT INTO Orders(OrdID,CustID,OrdDat) VALUES('9999','1234',GETDATE())\n";
0e {~:yVJ|1t105439strSQL=strSQL&"INSERT INTO OrderRows(OrdID,OrdRow,Item,Qty) VALUES('9999','01','G4385',5)\n";
X:\o&D9OYC105439strSQL=strSQL&"INSERT INTO OrderRows(OrdID,OrdRow,Item,Qty) VALUES('9999','02','G4726',1)\n";51Testing软件测试网 f`(kPr6H
strSQL=strSQL&"COMMIT TRANSACTION\n";51Testing软件测试网-q(e}tb
strSQL=strSQL&"SET XACT_ABORT OFF\n";51Testing软件测试网,FR.T5a0c*iCw*[P(j
oConn.Execute(strSQL);
1l5IcFY:}Y]105439其中,SET XACT_ABORT OFF 语句告诉SQL Server,如果下面的事务处理过程中,如果遇到错误,就取消已经完成的事务。51Testing软件测试网l ?jK*BV

g0H5l` e k105439方法四、数据库索引
|hK9nb2N105439
WwRj ra"L)B{105439那些将在Where子句中出现的字段,你应该首先考虑建立索引;那些需要排序的字段,也应该在考虑之列 。51Testing软件测试网5xnf!X|-c(@ sG&Nj
在MS Access中建立索引的方法:在Access里面选择需要索引的表,点击“设计”,然后设置相应字段的索引.51Testing软件测试网;~3zy7m)RB o
在MS SQL Server中建立索引的方法:在SQL Server管理器中,选择相应的表,然后“设计表”,点击右键,选择“Properties”,选择“indexes/keys”
*GFM3p@.g.?I:Si10543951Testing软件测试网Z6Nu:P(kA4X8W8l
方法五、避免使Text字段太大51Testing软件测试网-qtk4?7t,{T
51Testing软件测试网9q_H3UN{"`(Z@
当字符串的值大小不固定时,用varchar比用char的效果要好 些。我曾经看到一个例子程序,字段被定义为TEXT(255),但是他的取值经常只有20个字符。这个数据表有50k个记录,从而使这个数据库很大,大的数据库必然较慢。51Testing软件测试网7G7J w(D*@&g _k

TAG:

 

评分:0

我来说两句

我的栏目

日历

« 2023-03-30  
   1234
567891011
12131415161718
19202122232425
262728293031 

数据统计

  • 访问量: 2167
  • 日志数: 5
  • 建立时间: 2007-03-06
  • 更新时间: 2007-07-03

RSS订阅

Open Toolbar