关于ASP递归的问题讨论,高手请进!

jnqjj 2005-12-09 05:32:20
我再在用ASP写了个递归的程序,可是执行的速度太慢了,有哪位高手能给出以下程序的优化解决方法,虚心求教!敬请帮忙!!在线等待:

sub childnum(byval userid) '递归的遍历函数
dim rs
set rs=Server.CreateObject("adodb.recordset")
sql="select userid,shenhe,zcdata from user where anid="&userid
rs.open sql,conn
Do while not rs.eof
if rs("shenhe")=1 then
k=k+1 '计数器+1
end if
call childnum(rs("userid"))
rs.movenext
Loop
rs.close
set rs=nothing
end sub '函数结束
...全文
109 点赞 收藏 10
写回复
10 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
patchclass 2005-12-10
用存储过程啊
在递归或者循环里面写查询很慢的
回复
ShiningstarHu 2005-12-10
把你程序中的
set rs=Server.CreateObject("adodb.recordset")和set rs=nothing拿出来,
这两句话很费时间的。修改程序如下:
sub childnum(byval userid) '递归的遍历函数
sql="select userid,shenhe,zcdata from user where anid="&userid
rs.open sql,conn
Do while not rs.eof
if rs("shenhe")=1 then
k=k+1 '计数器+1
end if
call childnum(rs("userid"))
rs.movenext
Loop
rs.close
end sub '函数结束

然后需要做的是建立一个全局的rs就可以了。这样做简单一点。

这样优化后,你的程序速度可以提高70%-80%
回复
dh20156 2005-12-09
参考一下这个吧:
Set Nocount On
Create Table test(userid int,shenhe int,anid int)
Insert into test Select 1,1,0
Union Select 2,1,0
Union Select 3,1,1
Union Select 4,1,1
Union Select 5,1,2
Union Select 6,1,2
Union Select 7,1,3
Union Select 8,0,4

Create Table #t ([id] int,[level] int,sid varchar(100))
Declare @l int
Set @l=0
Insert into #t select [userid],@l,[userid] From [test] Where test.anid=0
While @@rowcount>0
Begin
Set @l=@l+1
Insert into #t select a.[userid],@l,CAST(b.sid as varchar)+','+CAST(a.[userid] as varchar) from [test] a,#t b where a.[anid]=b.[id] and b.[level]=@l-1 and a.shenhe=1
End

Set Nocount Off

Select test.userid,Count(1) As tc From #t,test Where charindex(CAST(test.userid as varchar),#t.sid)>0 Group by test.userid

Drop Table #t
Drop Table test

--结果:
/*
userid tc
----------- -----------
1 4
2 3
3 2
4 1
5 1
6 1
7 1

(所影响的行数为 7 行)
*/
回复
dh20156 2005-12-09
你的函数只递了,没见归啊?没有返回值啊。
回复
jnqjj 2005-12-09
谢谢,我正在看.
回复
KimSoft 2005-12-09
看上面我回的帖子。
回复
jnqjj 2005-12-09
谢谢 KimSoft 兄弟的提示,不过我不懂oracle,能用简单的SQL语句说明一下吗?
回复
KimSoft 2005-12-09
数据整形或分层的记录集能显示一个树状结构或相关记录集。这通过在记录集的字段中
包含一个记录集来实现,可以展现数据库的关系,而且多个记录集能在一次调用中返回。有
两个理由可以解释它为什么是有用的:
* 性能:当正确使用时,数据整形可以改善性能。
* 便利:在数据整形中非常容易映射父子关系。

你看看这个帖子吧
http://www.itll.net/Article/softtech/Website/ASP/jc/200506/32116.html
回复
KimSoft 2005-12-09
oracle里有个语法能取出树形结构,今天上午,刚写了一个,如果是Access和sqlserver,可以使用dataSharp取出树形结构。这样应该快很多。代码我没有写。

下面是orcale里的语句

select
lpad(' ', 2*level) || p_name,p_index,level
from
province_list
start with
par_index=0
connect by
prior p_index=par_index
回复
jspadmin 2005-12-09
关注
回复
相关推荐
发帖
ASP
创建于2007-09-28

2.8w+

社区成员

ASP即Active Server Pages,是Microsoft公司开发的服务器端脚本环境。
申请成为版主
帖子事件
创建了帖子
2005-12-09 05:32
社区公告
暂无公告