关于基于 MS SQL SERVER 的论坛分页模块问题
关于基于 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 做数据库时,你们是用什么方法建立分页模块的呢?
对于 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 做数据库时,你们是用什么方法建立分页模块的呢?
...全文
相关推荐
PR控制并网逆变器PSIM仿真
PR控制并网逆变器PSIM仿真PR控制并网逆变器PSIM仿真PR控制并网逆变器PSIM仿真PR控制并网逆变器PSIM仿真PR控制并网逆变器PSIM仿真PR控制并网逆变器PSIM仿真PR控制并网逆变器PSIM仿真PR控制并网逆变器PSIM仿真PR控制并网逆变器PSIM仿真PR控制并网逆变器PSIM仿真
构建***论坛社区:Discuz! NT for SQL Server v1.0安装与配置
本文还有配套的精品资源,点击获取 简介: 是一个基于.NET Framework的服务器端网页开发技术,本压缩包提供了基于 的论坛系统Discuz! NT for SQL Server v1.0的正式版,它是一个为企业和组织提供的网络社区解决方案。此版本针对.NET Framework 2.0进行优化,集成了丰富的论坛功能并支持自定义模板和插件。...
PR控制psim.zip_PR控制器 PSIM_PSIM 并网仿真_PSIM PR控制_PSIM 全桥_pr
PSIM PR控制器全桥并网逆变,可以仿真。
《模式识别与数据挖掘》配套PPT课件
《模式识别与数据挖掘》配套PPT课件
科技成果转化项目进场交易前,评估备案环节需要准备哪些材料?_8.docx
科易网基于AI模型+行业大数据,在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,推出科技创新领域的AI+工具与数智化解决方案,推动科技创新与产业创新智能化发展。


基础编程
