急!数据库查询优化问题

lgqt2000 2003-10-17 10:25:46
假如我无条件查询数据库里的1万条记录,然后显示在listview里面,
可是速度太慢了,怎么解决它,使它快一点呢。
我不想用进度条来显示进度。数据库用的是SqlServer2000,数据库查询后,把数据
存在服务器的缓存里,然后全部传输到客户端。然后我在循环1万次才显示在listview上。我想能不能数据库全部查出来后,先存在数据库的缓存里,然后只传
几十条记录给客户端,显示在listview上。当显示完后,在传几十条记录。
这样能实现吗。我用的是Vb6.o和Ado,和Sqlserver2000.
请大家教教我.谢谢.
...全文
43 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhangying7725 2003-10-17
  • 打赏
  • 举报
回复
学习中!UP!
rednod 2003-10-17
  • 打赏
  • 举报
回复
学习
golden24kcn 2003-10-17
  • 打赏
  • 举报
回复
写过的一个BBS,用了分页,你看看用得上吗?

Set RstBBs = Nothing
Set RstBBs = New ADODB.Recordset
RstBBs.CursorLocation = adUseClient
SQL = "select * from bbsmatter where bbsid=" & BBS(lstBBS.Selected)
RstBBs.Open SQL, Conn, adOpenStatic, adLockReadOnly, adCmdText
RstBBs.PageSize = 8 ''每页8个

Page = 1
If RstBBs.EOF Then GoTo 1
For I = 1 To RstBBs.PageSize
Set Nod = tvwCap.Nodes.Add(, , "n" & CStr(RstBBs.Fields("id")), RstBBs.Fields("caption") & _
" 发表于" & RstBBs.Fields("date") & " " & RstBBs.Fields("time") & " 阅读" & RstBBs.Fields("reading") & _
" 回复" & RstBBs.Fields("return") & " 作者 " & CStr(RstBBs.Fields("userid")), Val(RstBBs.Fields("imageindex")))
Set RstChild = New ADODB.Recordset
RstChild.CursorLocation = adUseClient
SQL = "select * from bbsreturn where bbsid=" & BBS(lstBBS.Selected) & " and topicid=" & RstBBs.Fields("id")

RstChild.Open SQL, Conn, adOpenStatic, adLockReadOnly, adCmdText

If Not RstChild.EOF Then
For J = 1 To RstChild.RecordCount
NodChild = RstChild.Fields("matter")
If Len(NodChild) > 15 Then NodChild = Mid(NodChild, 1, 12) & "..."
Set Nod = tvwCap.Nodes.Add("n" & CStr(RstBBs.Fields("id")), tvwChild, "r" & CStr(RstBBs.Fields("id")) & "_" & RstChild.Fields("id"), "回复: " _
& NodChild & " 发表于" & RstChild.Fields("date") & " " & RstChild.Fields("time") & _
" 作者 " & CStr(RstChild.Fields("userid")), Val(RstChild.Fields("imageindex")))
RstChild.MoveNext
Next
End If
RstChild.Close
Set RstChild = Nothing
RstBBs.MoveNext
If RstBBs.EOF Then GoTo 1
Next

lgqt2000 2003-10-17
  • 打赏
  • 举报
回复
当数据量很大时,数据从服务器到客户端传输数据花的时间会很多吗?
当然这有很多方面的原因。可是我想的是一条语句全查寻出来。
从服务器传到客户端时,每次只传几十条。
zjcxc 2003-10-17
  • 打赏
  • 举报
回复
数据库的处理速度不是问题.
zjcxc 2003-10-17
  • 打赏
  • 举报
回复
你的表结构,要显示的内容,最好举例说明.
yoki 2003-10-17
  • 打赏
  • 举报
回复
dim rs as new adodb.recordset
dim i as integer
rs.CursorLocation =adUseClient

rs.open "select top 10000 col1 from table1",cn

'在数据量很大的时候用For循环比Do While要快很多
for i=0 to rs.recordcount
Listview.ListItems.Add , , rs!col1, , 9
rs.movenext
next i
射天狼 2003-10-17
  • 打赏
  • 举报
回复
可以啊,rs.Open "select * from table", cn, adOpenForwardOnly, adLockReadOnly
先存到ADO的记录集里,然后用循环控制取多少条就行了,或者:

rs.Open "select top 5 id from aa where id in (select top 10 id from aa) order by id desc;", cn, adOpenForwardOnly, adLockReadOnly
直接用SQL语句取其部分数据,这样更省资源~~
yoki 2003-10-17
  • 打赏
  • 举报
回复
可以采取分页显示
一般的方法
select Top pageSize *
from T
where SortField NOT IN (select Top pageSize*pagei SortField
from T
order by SortField )
order by SortField

例如,每页7条,列印第7页:
select Top 10 *
from T
where SortField NOT IN (select Top 70 SortField
from T
order by SortField )
order by SortField


or

CREATE PROCEDURE Get_Customers_By_Page
@CurrentPage int,
@PageSize int,
@TotalRecords int output
as

SELECT identity(int,1,1) as id ,* into #TempTable from table

DECLARE @FirstRec int, @LastRec int
SELECT @FirstRec = (@CurrentPage - 1) * @PageSize
SELECT @LastRec = (@CurrentPage * @PageSize + 1)

SELECT
*
FROM
#TempTable
WHERE
ID > @FirstRec
AND
ID < @LastRec

SELECT @TotalRecords = COUNT(*) FROM table






或:

如果你排序的话,第一次用
select top 100 * from yourtable order by SomeField

记住每页的第一个和最后一个记录

往后翻页,你用
select top 100 * from yourtable where SomeField > '最后一个记录' order by
SomeField

往前翻页,你用
select * from (select top 100 * from yourtable where SomeField < '第一个
记录' order by SomeField desc ) t order by SomeField

1,216

社区成员

发帖
与我相关
我的任务
社区描述
VB 数据库(包含打印,安装,报表)
社区管理员
  • 数据库(包含打印,安装,报表)社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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