一个分页的问题,我只有这80分了,帮我我吧,跪求!!!!

hahawuwu 2003-10-20 11:19:54
大家好,我是一个asp的菜菜鸟,现在有一个很严峻的问题要我来处理,就是我手头上有一个500-600万条记录的数据库表,要通过asp来进行查询,可是动不动就能查出200-300万条记录,查询的速度级慢!!我用朋友给我的分页代码试了试,没有什么效果。我因为看他还是把所有的记录都先读到的内存中,然后再进行的分页,这样无法提高查询的速度。
不知道各位高手、大侠有没有什么更好的办法帮我解决这个问题。
我觉得应该有一种方法能让系统只查询每页要显示的记录的数量的方法。也就是说每页要显示100条,那系统就查这100条,如果用户点击下一页这个按钮系统再去差下一个100条记录。同时告诉用户有多少页,当前是多少页。

下面就是我的朋友给我的代码,我用了不行,大家也帮我看看是不是我给改错了。
不过还是希望有人能帮我提供另外一种方法(就是我上面说得那种方法),最好有代码!谢谢了!小弟在这里先谢过了。

<%@ LANGUAGE="VBSCRIPT" %>
<!--#include file="conn.asp"-->
<!--#include file="adovbs.inc"-->
<%
Dim RecordPerPage, absPageNum, TotalPages, absRecordNum, rsTest, StrSQL
'absPageNum - 当前页为第几页
'TotalPages - 总的页数
'absRecordNum - 当前页中某一条记录的序号, 如 1-10

RecordPerPage = 10 '每页显示的记录数

' 取得所输出数据的 当前页码
If Request.ServerVariables("CONTENT_LENGTH") = 0 Then
'若没收到表单递交的数据(如首次加载该页时), 则从第 1 页开始显示
absPageNum = 1
Else
'取出按 按钮 时的页码
absPageNum = CInt(Request.Form("PressPageNum"))
'如按 上一页 则页码 -1, 按 下一页, 则页码 +1
If Request.Form("Submit") = "上一页" Then
absPageNum = absPageNum - 1
ElseIf Request.Form("Submit") = "下一页" Then
absPageNum = absPageNum + 1
End If
End If

' 创建记录集对象
Set rsTest = Server.CreateObject("ADODB.Recordset")

rsTest.CursorLocation = adUseClient '这样设置可减轻数据库负载
rsTest.CursorType = adOpenStatic '游标需要前后移动,不能设为仅向前
rsTest.CacheSize = RecordPerPage '设置这个选项会提高性能

StrSQL = "SELECT * FROM tiaoma where col004='03'"
rsTest.Open StrSQL, Cnn, , , adCmdText

rsTest.PageSize = RecordPerPage '设置每一页的记录数

If Not(rsTest.EOF) Then
rsTest.AbsolutePage = absPageNum
End If

TotalPages = rsTest.PageCount
%>

<% ' 下面部分 输出当前页的数据至浏览器 %>
<Html>
<body>
<table colspan=8 cellpadding=5 border=0>
<tr>
<td align=CENTER bgcolor="#800000" width="109"> <font style="ARIAL NARROW" color="#ffffff" size="2">col001</font></td>
<td align=CENTER width=459 bgcolor="#800000"> <font style="ARIAL NARROW" color="#ffffff" size="2">col002</font></td>
<td align=CENTER bgcolor="#800000" width="109"> <font style="ARIAL NARROW" color="#ffffff" size="2">col003</font></td>
<td align=CENTER width=459 bgcolor="#800000"> <font style="ARIAL NARROW" color="#ffffff" size="2">col004</font></td>
<td align=CENTER bgcolor="#800000" width="109"> <font style="ARIAL NARROW" color="#ffffff" size="2">col005</font></td>
<td align=CENTER width=459 bgcolor="#800000"> <font style="ARIAL NARROW" color="#ffffff" size="2">col006</font></td>
<td align=CENTER bgcolor="#800000" width="109"> <font style="ARIAL NARROW" color="#ffffff" size="2">col007</font></td>
<td align=CENTER width=459 bgcolor="#800000"> <font style="ARIAL NARROW" color="#ffffff" size="2">col008</font></td>
</tr>
<% ' 用循环输出当前页的 10 条数据
For absRecordNum = 1 to rsTest.PageSize
%>
<tr>
<td bgcolor="f7efde" align=CENTER> <font style="ARIAL NARROW" size="2"><%= rsTest("col001")%></font></td>
<td bgcolor="f7efde" align=CENTER> <font style="ARIAL NARROW" size="2"><%= rsTest("col002")%></font></td>
<td bgcolor="f7efde" align=CENTER> <font style="ARIAL NARROW" size="2"><%= rsTest("col003")%></font></td>
<td bgcolor="f7efde" align=CENTER> <font style="ARIAL NARROW" size="2"><%= rsTest("col004")%></font></td>
<td bgcolor="f7efde" align=CENTER> <font style="ARIAL NARROW" size="2"><%= rsTest("col005")%></font></td>
<td bgcolor="f7efde" align=CENTER> <font style="ARIAL NARROW" size="2"><%= rsTest("col006")%></font></td>
<td bgcolor="f7efde" align=CENTER> <font style="ARIAL NARROW" size="2"><%= rsTest("col007")%></font></td>
<td bgcolor="f7efde" align=CENTER> <font style="ARIAL NARROW" size="2"><%= rsTest("col008")%></font></td>
</tr>
<%
rsTest.MoveNext
If rsTest.EOF Then
Exit For ' 如果已到记录尾, 退出 - 如最后一页数据不满页时
End If
Next

rsTest.Close : Cnn.Close
Set rsTest = Nothing : Set Cnn = Nothing
%>
</table>

<% ' 下面部分 是两个按钮 "上一页" "下一页" %>
<Form Action = "<%= Request.ServerVariables("SCRIPT_NAME") %>" Method="Post">
<Input Type="Hidden" Name="PressPageNum" Value="<%= absPageNum%>">
<%
If absPageNum > 1 Then '如果当前不是第一页, 则显示上一页按钮 %>
<Input Type="Submit" Name="Submit" Value="上一页">
<% End If
If absPageNum <> TotalPages Then '如果当前页不是最后一页, 则显示下一页按钮%>
<Input Type="Submit" Name="Submit" Value="下一页">
<% End If %>
</Form>
<P><Center> [ 第 <font color="#CC0033"><%= absPageNum %></font> 页,
共 <font color="#CC0033"><%= TotalPages %></font> 页 ] </Center></P>
</BODY>
</HTML>
...全文
39 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
topmonkey 2003-10-22
  • 打赏
  • 举报
回复
To:hahawuwu()
专家分只能是给正确解答问题的人。像你这样给我加分,等于是我在拿可用分换专家分。别人会认为我在倒分,而倒分的行为在csdn中是为人所不齿的。
suhuoqiang 2003-10-21
  • 打赏
  • 举报
回复
ding
lo050 2003-10-21
  • 打赏
  • 举报
回复
以下是我在另外一个论坛发过的,希望有帮助,另:存储过程是必须的,建议你找本数据库的书看看这部分

blackhead
[blackhead]
发表于:2003-07-11 13:55:03 联想打印机大奖天天等你拿!
--------------------------------------------------------------------------------
我有一套系统,最近运行起来有问题,昨天偶然看到这个帖子,意识到是RECORDSET的分页效率太低,因为数据量很大。
昨天改写了程序,把记录集分页改为在存储过程中判断只选择指定页。可是问题是我的记录没有一个顺序号(或者说我指定的排序方式与主键是不相同的),只能先把所有记录按顺序都选到一个临时表中,并自动加上一列序列号,然后再从中选取,速度当然比记录集分页快了很多,但还是不够理想,把简化过的存储过程贴上来,不知哪位有更好的建议

CREATE PROCEDURE GET_APP_QUEUE(@login_name char(20), @page_size int=10, @current_page int=1) AS

SET NOCOUNT ON

DECLARE @rec_count int
DECLARE @rec_start int
DECLARE @rec_end int

CREATE TABLE #INBOX_TABLE (seq INT IDENTITY NOT NULL PRIMARY KEY, tx_no CHAR(20) NOT NULL,sort_by CHAR(1) NOT NULL, tx_date smalldatetime )


INSERT INTO #INBOX_TABLE (tx_no,sort_by,tx_date)
SELECT a.tx_no, sort_by='0',a.tx_date
FROM WF_QUEUE a INNER JOIN WF_ROUTE b ON a.tx_no =b.tx_no
AND b.related_user=@login_name
AND a.current_status>=b.sequence
AND a.current_status<>1000

SELECT @rec_count=count(tx_no) FROM #INBOX_TABLE
SELECT @rec_start=(@current_page-1) * @page_size +1
SELECT @rec_end =@current_page * @page_size

SELECT a.tx_no, a.tx_type,a.tx_date, a.subject, a.current_status, a.receipt_status,f.username, d.username as waiting_user, x.seq, total_count=@rec_count

FROM #INBOX_TABLE x INNER JOIN WF_QUEUE a ON a.tx_no=x.tx_no AND
x.seq>=@rec_start AND x.seq<=@rec_end LEFT OUTER JOIN XXX......
ORDER BY x.seq

结果集为按照@page_size 和@current_page指定的单页记录集,总记录数存在total_count列中返回供ASP或COM中计算页码用
blackhead
[blackhead]
发表于:2003-07-11 13:59:28 PCHOME 诚聘项目经理/需求分析师
--------------------------------------------------------------------------------
SELECT DISTINCT TOP XXX FROM TABLE WHERE ID NOT IN (SELECT TOP YYY FROM TABLE...)


在记录很多和 TABLE 中的关系比较复杂时效率很低,DISTINCT 和NOT IN 都是应该尽量避免使用的sql语句
blackhead
[blackhead]
发表于:2003-07-11 14:07:14 PCHOME 诚聘网站程序开发
--------------------------------------------------------------------------------
上面的SP漏了一行,重贴

CREATE PROCEDURE GET_APP_QUEUE(@login_name char(20), @page_size int=10, @current_page int=1) AS

SET NOCOUNT ON

DECLARE @rec_count int
DECLARE @rec_start int
DECLARE @rec_end int

CREATE TABLE #INBOX_TABLE (seq INT IDENTITY NOT NULL PRIMARY KEY, tx_no CHAR(20) NOT NULL,sort_by CHAR(1) NOT NULL, tx_date smalldatetime )


INSERT INTO #INBOX_TABLE (tx_no,sort_by,tx_date)
SELECT a.tx_no, sort_by=(CASE WHEN b.[sequence]=a.current_status THEN '0' ELSE '1' END),a.tx_date
FROM WF_QUEUE a INNER JOIN WF_ROUTE b ON a.tx_no =b.tx_no
AND b.related_user=@login_name
AND a.current_status>=b.sequence
AND a.current_status<>1000
ORDER BY sort_by,a.tx_date DESC

SELECT @rec_count=count(tx_no) FROM #INBOX_TABLE
SELECT @rec_start=(@current_page-1) * @page_size +1
SELECT @rec_end =@current_page * @page_size

SELECT a.tx_no, a.tx_type,a.tx_date, a.subject, a.current_status, a.receipt_status,f.username, d.username as waiting_user, x.seq, total_count=@rec_count

FROM #INBOX_TABLE x INNER JOIN WF_QUEUE a ON a.tx_no=x.tx_no AND
x.seq>=@rec_start AND x.seq<=@rec_end LEFT OUTER JOIN XXX......
ORDER BY x.seq
hahawuwu 2003-10-21
  • 打赏
  • 举报
回复
刚刚过零点我又给帖子加了10分,只有10分了,还希望大家多多帮我
hahawuwu 2003-10-21
  • 打赏
  • 举报
回复
好的,我去试试,不过我刚才也在论坛中看看类似的分页处理方法,不过都提到了一个存储过程的东西,哪为高人能给我讲讲吗?
goldme76 2003-10-21
  • 打赏
  • 举报
回复
用lyvictor(匆匆)的方法和指针定位试试
hahawuwu 2003-10-21
  • 打赏
  • 举报
回复
在这个版中没有什么解决的办法吗?我是一个菜菜菜菜菜菜菜菜菜菜菜菜鸟,不过现在真的有点着急,所有还请大家多多帮忙了!
lyvictor 2003-10-21
  • 打赏
  • 举报
回复
如果带了条件select count(xx) from xxx where xx=''的话速度就要明显慢点,我试过用这个命令查询200万条数据约近20秒的速度
zorou_fatal 2003-10-21
  • 打赏
  • 举报
回复
去 SQL 版 问问大力

^_^
hahawuwu 2003-10-21
  • 打赏
  • 举报
回复
我用的sqlserver的数据库。上面一个朋友说的那个存储过程是什么?有什么代码可以参考吗?

谢谢!
lyvictor 2003-10-21
  • 打赏
  • 举报
回复
可以使用select count(xx) from xxx 先得到总页数,这样查询200万条数据也就几秒钟,然后使用楼上那位仁兄所说的指针定位的方法得到每页数据,我就是用这种方法,速度还可以让顾客忍受!
topmonkey 2003-10-21
  • 打赏
  • 举报
回复
男儿膝下有黄金,为了一点可用分屈膝,不值。
-------------------------
topmonkey给hahawuwu捐献了1000可用分;hahawuwu收到了:900可用分
foglee 2003-10-21
  • 打赏
  • 举报
回复
象这样大数据量的查询,最好还是要添加相应的索引!
zhaoliangpat 2003-10-21
  • 打赏
  • 举报
回复
这个还不错。
http://www.mypcera.com/softxue/7/asp/0030.htm
gshope 2003-10-21
  • 打赏
  • 举报
回复
用存储过程效率是高了一些,但是要自己写。
还有很重要的一点要提醒楼主,注意数据库结构的优化,特别是根据查询条件而建立相应的索引,可以极大的提高查询效率,这样的话你甚至不用存储过程,还是用原来的程序就可以。
GageCSDN 2003-10-21
  • 打赏
  • 举报
回复
用存储过程可能好得多
hahawuwu 2003-10-21
  • 打赏
  • 举报
回复
顶一下吧,希望能多听到高手的意见
zorou_fatal 2003-10-20
  • 打赏
  • 举报
回复
用存储过程吧.用recordset会让你很难受的。
goldme76 2003-10-20
  • 打赏
  • 举报
回复
不过,我再帮你找找,有没有好的方法
goldme76 2003-10-20
  • 打赏
  • 举报
回复
在我的想法里,应该是没有的,要得到总页数,那么就得把数据库全部读完,几百万条数据,肯定慢啊,你用的什么数据库?
加载更多回复(5)

28,390

社区成员

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

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