ASP高手请进,高分问题

subzero 2000-07-20 03:20:00
我写的论坛用了一个递归函数取记录,形式如CHINAASP的论坛
代码很简练但是发现CPU的占用率非常高
请问怎样解决,请详细说明
不胜感激
...全文
381 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
subzero 2000-07-21
  • 打赏
  • 举报
回复
问题解决了:)
谢谢大家
linfeng 2000-07-21
  • 打赏
  • 举报
回复
subzero
你是怎么解决的?
w102272 2000-07-21
  • 打赏
  • 举报
回复
我认为完全递归并非最优。
其实目的就是leslielu的说的,找树型显示。
但是采用递归,因为不能保存每次查询的记录集,
所以每找到一个子结点,走完它的子树后,回退都要发出重复查询。
最好的情况下,共享一个连接,系统开销也是非常大的。
这种递归方式的深度优先遍历算法并不好。
在最好的情况下,所有帖子都是前一个帖子的跟帖,这种线性化的方式
也要花费N*(n+1)/2的SQL查询数。每多一个结点,就要多一次回归后的恢复查询。

优化方法:
帖子一般都是有唯一ID号的,而且这个ID号总是在不断增加的。
跟帖子给两个字段:parentid,id两个字段。
时间的增加,会呈现如下的数据:
ID, 上级帖子ID
0 none
ID 自己的ID=(新问题) 或者父帖子的ID (父帖子的回复帖子)
这样只要指定最开始的查询点,(从某天的帖子开始),
每次发出一个SQL 查询,都可以获取该父帖子的所有下一级帖子的回复。
即:把所有帖子想象成树,展开的方式是每次一层。
这样我的论坛的树型结构将以树丛的方式生长,而不是一个枝条一个枝条的。
而且我可以任意决定展开到什么级别。
例如下图所示:
ID,PID ID PID
+ 0 0 0 0
+ 1 0 1 0
+ 2 0------第一层 4 0
+ 5 5------第一层 5,5 (多线索的,在问题0答复期间又提出新问题)
+ 3 2------第二层 7 4
+ 6 5------第二层 6,5 (多线索的,在问题0答复期间对问题5回复)
+ 4 3------第三层 15 7
。。。。。
由于问题是多线索的,为了保证我每次都能够处理完一个帖子的所有下级帖子而不混乱。所以在SELECT 我一定要使用ORDER BY parentid desc, id asc. 同时,由于增长的ID本身隐含了按时间从旧到新的展开。为了保证论坛总是先看最新的帖子,只需要 ORDER BY PARENTID DESC的逆序就可以了。

在得到分层的处理数据后,需要做的就是自上而下的扫描,处理所有的文章,并把它们生成的文本插入到合适的地方上(生长的树丛的某个枝条上)。为了做到这一点,
为返回的文本开一个大文本缓冲区,我们在里头反复加工直到得到最终的结果。
另外,我们还需要做一个数组来保存每个文本的插入点。一旦某个PARENTID需要处理,就把它加到集合中,处理完毕后就从集合中删除掉(包含那些叶子结点)。直到循环到达记录集的终点。
上面的例子为:(0)->(0,1)->(0,1,4)->(4,7)->(7,5)->(7,5,6)->(7)->(7,15)
在所有加工完成后:
将文本缓冲区中的内容输出,就得到了树型展开的结果。

这样处理:
1、不再需要保持递归算法的大量变量(占用服务器资源),何况数据表本身是不能象局部变量那样保存的。
2、利用SQL ORDER排序和一次查询大大提高了性能。
3、将对数据库的递归查询变成在服务器上对集合的操作和对字符串的处理,这些在
服务器内存中执行的处理显然比数据库访问要快太多了。
4、这样编程量会比较大。
这种方法比较通用。

--------------------------------------------------------------------
还有一种方法,是在数据库上做编码,
比如:
新帖子ID 0
新帖子的同级别回复帖子: 01 , 02...
回复的回复 011,021。。。
这样在取帖子的时候,就可以一次SELECT取出所有分级了。
这种方法很简单,速度也不慢。
缺点是每个级别的回复编码空间是有限的。如果回复很多,编码就会很长,
对于论坛这种应用是足够的,对付层次很高的树型数据就有限制了。












subzero 2000-07-20
  • 打赏
  • 举报
回复
就是递归的论坛
象CHINAASP那样形式的
FOLLOWID是跟帖编号,ID为自动编号
所有首发帖子的FOLLOWID为0
跟帖的FOLLOWID为父帖的ID
leslielu 2000-07-20
  • 打赏
  • 举报
回复
^o^我做过和你一样的功能,是招上级帖子,其实就是要树型显示,是吧.
我用VB作DLL来实现这个功能,程序和你的差不多,但是数据库方面我用的是存储过程.
封装它吧,这样的递归没法再优化了.

蝈蝈俊 2000-07-20
  • 打赏
  • 举报
回复
效率差,是由于反复的连接数据库,这个程序最好用在想测试系统行能时。
我看了半天,你到底要实现个什么功能????
subzero 2000-07-20
  • 打赏
  • 举报
回复
少打了


loop跟end sub之间

rs.close
set rs=nothing
subzero 2000-07-20
  • 打赏
  • 举报
回复
<%
rs.open "select * from bbs where followid=0 order by id desc",cn,1,1
do until rs.eof
------
输出
------
findnextrecord rs("id")
rs.movenext
loop

sub findnextrecord(followid)

dim rs
rs.open "select * from bbs where followid=" & followid,cn,1,1
do until rs.eof
-------
输出
-------
findnextrecord rs("id")
rs.movenext
loop

end sub
%>
w102272 2000-07-20
  • 打赏
  • 举报
回复
首先应该优化你的程序结构,把程序贴出来看看吧。
蝈蝈俊 2000-07-20
  • 打赏
  • 举报
回复
具体的降低CPU的占用率很难说。
不过效率是肯定提高的。
蝈蝈俊 2000-07-20
  • 打赏
  • 举报
回复
com+组件是可以利用 线程spooling,数据库spooling,提高应用程序的执行效率。
简单的说就是可以使公用的部分可以重用。

subzero 2000-07-20
  • 打赏
  • 举报
回复
是否能够在写入数据库就实现递归了呢
subzero 2000-07-20
  • 打赏
  • 举报
回复
CPU的占用率高达90%
subzero 2000-07-20
  • 打赏
  • 举报
回复
CPU的占用率高达90%
如果用组件的话能够降低到多少?
蝈蝈俊 2000-07-20
  • 打赏
  • 举报
回复
那就把你的代码贴出来,尽量帮你优化一下。
subzero 2000-07-20
  • 打赏
  • 举报
回复
除此之外没有其他解决办法了吗?
leslielu 2000-07-20
  • 打赏
  • 举报
回复
同意ghj1976将你的递归算法封装起来.
蝈蝈俊 2000-07-20
  • 打赏
  • 举报
回复
用com+组件
szdino 2000-07-20
  • 打赏
  • 举报
回复
你把你写的程序片断贴出来啊
qiuhao 2000-07-20
  • 打赏
  • 举报
回复
使用定时刷新对服务器的负担轻

28,390

社区成员

发帖
与我相关
我的任务
社区描述
ASP即Active Server Pages,是Microsoft公司开发的服务器端脚本环境。
社区管理员
  • ASP
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧