日期:2014-05-17  浏览次数:20834 次

【循环优化】有个循环,效率很低,高手帮忙看看如何优化???万分感激!
表HyMoneyAccount 记录每个会员得到的历史积分,
表HyClub 记录会员资料,并记录会员在活动中能获得的最高积分

此段代码,每执行一次,会给表中每个符合条件的会员(未达到可以获得最积分HyTopMoney<DTMoney),增加3个积分


现在hyclub中数据大概8w条,执行起来,很慢,应该如何优化,才能提高执行效率呢??

set rs1=nothing
set rs1=server.CreateObject("adodb.recordset")
sql ="select id,hynumber,HyTopMoney from HyClub"
rs1.Open sql,conn
if Rs1.Recordcount>0 Then
while (not Rs1.eof)
hynumberee=rs1("hynumber") '会员名
HyTopMoney=rs1("HyTopMoney") '活动中能获得的最高积分

Set HyRs8=nothing
set HyRs8=server.CreateObject("adodb.recordset")
sql = "select AMoney from HyMoneyAccount where HyNumber ='" & HyNumberee & "'"
HyRs8.Open sql,conn,1,1
if HyRs8.recordcount>0 then
DTMoney=HyRs8("DTMoney")

If CDbl(DTopMoney)>CDbl(DTMoney) Then
set Temprs=nothing
set Temprs=server.CreateObject("adodb.recordset")
sql=""
sql="update HyMoneyAccount set DTMoney=DTMoney+3 where HyNumber='"&HyNumberee&"'"
Temprs.Open sql,conn
set Temprs=Nothing
End If 

End If

Rs1.movenext
Wend
End If

------解决方案--------------------
楼主,你这种不慢才怪,几W多条记录要循环,循环体内又连接数据库
其实你这种要求只要一条SQL就够了
SQL code

update ma set DTMoney=DTMoney+3
    from HyMoneyAccount ma inner join 
HyClub c on ma.HyNumber=c.hynumber
where c.HyTopMoney>ma.DTMoney

------解决方案--------------------
一般处理慢的原因很多,一方面是sql语句写的不恰当,像ls说的,一方面很多时间花费在连接数据库以及数据往返操作上,可以通过建立存储过程(在存储过程中进行批处理)减少与数据库连接的次数
------解决方案--------------------
同意一楼,既然是所有符合条件的同时+3分,那就没必要循环再一条一条判断了,直接将符合条件的所有记录同时更新不就好
------解决方案--------------------
同意一楼。频繁链接数据库,会很慢的。