本日志标题:抽取10万条数据,想起GetRows()        [2006-10-9]

现有10W条数据,Access数据库保存

通过正常提取:


<%
Set conn= Server.CreateObject("ADODB.Connection")
connstr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source="&Server.MapPath("db2.mdb")
conn.Open connstr

Set rs = Server.CreateObject ("ADODB.Recordset")
sql = "Select * from people order by id desc"
rs.Open sql,conn,1,1

Do While Not rs.EOF
    Response.write rs("id")&" | "
    rs.MoveNext
Loop
%>


http://www.cnbruce.com/test/getrows/show1.asp

耗时3,250.000毫秒,总测试平均值在3秒左右

==========================================================

使用存储过程提取:


<%
Set conn = Server.CreateObject("ADODB.Connection")
Set cmd = Server.CreateObject("ADODB.Command")
conn.Open "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" & Server.MapPath("db2.mdb")

cmd.ActiveConnection = conn
cmd.CommandText = "Select * from people order by id desc"
Set rs = cmd.Execute

Do While Not rs.EOF
Response.write rs("id")&" | "
rs.MoveNext
Loop
%>


http://www.cnbruce.com/test/getrows/show2.asp

耗时2,187.500毫秒,总测试平均值在2秒左右

=========================================================

以上两种均不能彻底解决执行时间漫长的问题,主要原因即是循环每次都须向数据库抽取记录(Command速度相对较快)

那么使用GetRows()方法呢:


<%
Set conn = Server.CreateObject("ADODB.Connection")
Set cmd = Server.CreateObject("ADODB.Command")

conn.Open "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" & Server.MapPath("db2.mdb")
cmd.ActiveConnection = conn
cmd.CommandText = "Select * from people order by id desc"
Set rs = cmd.Execute
rsArray = rs.GetRows()

For i = 0 To UBound(rsArray, 2)
Response.Write rsArray(0, i)&" | "
Next
%>


http://www.cnbruce.com/test/getrows/show3.asp

耗时187.500毫秒,总测试平均值在0.2秒左右

GetRows()方法是将数据从 Recordset 复制到二维数组中,这是一个二维数组,第一个下标标识字段,第二个则标识记录号

所以rsArray = rs.GetRows()
rsArray(0, 0)就表示记录集第一行的第一字段值
rsArray(1, 0)就表示记录集第一行的第二字段值

数组的数据是保存在内存中的,这就从根本上解决了每次显示记录还需向数据库请求的麻烦。

另外,关于GetRows()的详细介绍和用法,这里有份内容参考

http://www.51windows.net/pages/Ado/mdmthgetrows.htm

http://www.blueidea.com/tech/program/2005/2853.asp


在百度搜索完整的抽取10万条数据,想起GetRows()内容,或者用Google搜索相关的更多内容

By [cnbruce] at 16:36:18 | 评论 [59] | 浏览 [30405] | TrackBack| 返回顶部

About Comments
By [aaaada] at 2006-10-9 18:28:28
不太明白这个"UBound(rsArray, 2)"是什么意思,应该是总记录数,但是第一次见,呵呵
百度知道小偷.
http://www.lvjin.com.cn/
By [知识酷] at 2006-10-9 19:04:39
UBound(rsArray, 2)
应该是取二维数组rsArray的第二维的上标吧。
By [Leady] at 2006-10-9 22:34:37
内存换速度...

都在内存运算,当然快乐
By [叶子] at 2006-10-10 10:50:26
内存消耗太大,正有这种担心,怎么用还得看具体情况吧
By [zhangjie617] at 2006-10-12 14:01:28
每次现实完毕就把数组给清空了,还会占用内存么?
By [飞飞] at 2006-10-12 20:32:21
学习学习~~~~~
By [x_hunter] at 2006-12-28 12:28:42
用在读取系统信息并存在缓存中不错。
By [kuhanzhu] at 2007-7-2 15:16:11
各有优缺吧....当然,也不是很熟,不是很确定,不过这个试验很有价值,呵呵
By [helloworld] at 2007-12-2 23:58:28
不错,现在的大型网站都已经用到这种技术了(把要用的数据全部读到内存里面),在没有看到这个之前我一直想找个问题.呵呵!今天就这么解决了!

接着还有一个问题要解决:就是利用多个cpu,使运算速度更快.现在的一般程序在单核和多核上运行,多核占不了优势.如果有人明白的话,请教大家能够q我啊:51033044.

最好祝福 站长 新婚快乐
By [haohao110] at 2008-1-7 16:17:13


Post a Comment
呢称: 验证码: 
禁止笑脸转换 禁止UBB | 缩放输入框:6 5 | [Ctrl+Enter提交](1000个字符限制)