关于基于 MS SQL SERVER 的论坛分页模块问题

anfield 2002-07-29 05:19:38
关于基于 MS SQL SERVER 的论坛分页模块问题

对于 mysql,有limit语句进行对特定访问数据的查询。但对于 MS SQL SERVER,就没有 limit语句了,由于我写的论坛(http://ynwa.yeah.net)是用 MS SQL SERVER做数据库服务器的。这个问题一度令我非常烦恼。最终,刚开始学 MS SQL SERVER的我看了很多书,找到了一个解决的方案,用一种叫“游标”的方法。
部分关键代码如下:
<?php
……
……
//访问数据库,在数据库建立游标,作分页显示用
//为已经按发表时间排列好的所有主题建立游标 num_of_topic
$str_select_message="declare num_of_topic SCROLL CURSOR FOR ";
$str_select_message.="select * from soccer_forum where message_pro='farther' and on_top=0 and table_id=$table_id order by lastest_time DESC";
$select_message=mssql_query($str_select_message);
//打开游标 num_of_topic
$str_open_cursor="open num_of_topic";
$open_cursor=mssql_query($str_open_cursor);
//计算每页开始,结束的数据的游标数(假设每页显示20条主题)的公式
$star_data=1+($page-1)*20;
$end_data=($page-1)*20+20;

//如果是最后一页,循环所列出的表格等于剩余的帖数
if($page==$total_pages){
$end_data=$total_data;
}
//显示主题,按每页开始,结束的游标访问数据库记录
for($i=$star_data;$i<=$end_data;$i++){
$str_query="fetch absolute $i from num_of_topic";
$query=mssql_query($str_query);
$fetch_object=mssql_fetch_object($query);
//get_message.php是用于循环显示已经调出的20条主题的模块
require("functions/get_message.php");
}

……
……
//以下是分页显示的页数链接(省略)
……
?>


问题好像解决了,本来以为可以用游标就能在用户打开特定页数时,数据库只访问特定的20条记录,这样会提高速度。但后来想了很久,发觉,我在建立游标之前,最终也用到了:
select * from soccer_forum where message_pro='farther' and on_top=0 and table_id=$table_id order by lastest_time DESC";
也就是说,在建立游标前,数据库先要访问所有数据,为所有数据按时间排列顺序,这样实际上只访问20条数据,但却要查询所有数据,会不会导致用户访问论坛时浪费了服务器的访问时间,导致调出数据缓慢呢?实际上,我的论坛暂时只有主题200多,连回复都不超过2000,我试过用SQL QUERY ANALYZER 用 select * from soccer_forum ,结果1000多条数据用了不过1秒。我惊叹数据库速度快之余,不禁又担心到,现在我论坛速度正常,会不会可能是主题很少,即使访问所有数据,也不会感到缓慢呢?我的分页模块,在理论上到底是合理,还是非常愚蠢呢?假设我的论坛主题多达数百万(当然不可能)时,访问速度是不变,还是提高数千倍呢?请各位高手告诉我理论上会出现的后果。

同时,以大家写论坛的经验,你们在用 MS SQL SERVER 做数据库时,你们是用什么方法建立分页模块的呢?
...全文
64 点赞 收藏 7
写回复
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
anfield 2002-08-04
提。
回复
anfield 2002-07-31
没人能帮我吗?
回复
anfield 2002-07-30
但究竟我的代码有没有问题呢?
回复
yukeelau_1020 2002-07-30
对于不懂SQL SERVER 存储过程的人,也可以用 SELECT TOP 方法,如上例取得当前页的SQL 语句如下:
SELECT TOP 20 * FROM table_name where lastest_time > $lastest_time order by lastest_time

其中 $lastest_time 为上一页最后一条记录的 $lastest_time 的值。
回复
wasy 2002-07-29
这个存储过程只返回适合条件的纪录,而中间没用到php,asp等
回复
anfield 2002-07-29
什么独立语言?
回复
wasy 2002-07-29
收藏先,以后有空试一试。

可以写一个独立语言的分页存储过程,用到临时表
我在asp高级编程一书里面看到过
回复
发动态
发帖子
基础编程
创建于2007-09-28

2.1w+

社区成员

从PHP安装配置,PHP入门,PHP基础到PHP应用
申请成为版主
社区公告
暂无公告