Asp教程

通过asp实例结合结合ACCESS,MSSQL来更好的深入Asp学习 - 爬坡者

« Recordset对象和Command对象来访问数据库的区别在哪里asp实现无刷新、模糊查询xml的代码 »

ASP抽取数据的执行效率

通常从数据库中抽取数据记录,需要使用到SQL语句,查询获得相关记录集,然后从记录集中选择相关字段、相关记录行进行显示。

那么在抽取到显示的一系列列过程中,如果注意如下几个要点,则令抽取数据的执行效率大大增加。

1,明确抽取的字段名称

正常的SQL语句抽取记录是:
代 码 :

Select * from [data_table] 


即从数据表data_table中抽取所有字段的记录值。

Select * 语句的执行效率是很低的,因为在执行这样的语句的时候其实执行了两次查询,在执行select语句前,首先必须查询系统表来确定名称和数据类型。

所以尽量最少使用select *语句,而使用明确的字段名称,如:
代 码 :

Select cn_name,cn_pwd from [data_table] 


2,使用rs(0)比rs(filename)更快
代 码 :

Set rs=conn.Execute("Select cn_name,cn_pwd from [data_table]") 


记录集rs()里面可以写字段名(字符型),或者字段索引号(数字),它代表字段列表中第几个字段。比如:

rs(0)就表示rs("cn_name")
rs(1)表示rs("cn_pwd")

事实已证明了用索引数(index number)访问记录集元素要比用字段名称(field name)快出几倍。按字符串查询要比按整数查询花去更多的时间和系统资源。


3,使用记录集rs值前,将其赋值给变量
代 码 :

<% 
Set rs=conn.Execute("Select cn_name,cn_pwd from [data_table] where cn_id=1")
if not rs.eof then 
do while not rs.eof 
cn_name = rs(0) ' 把rs值赋给变量 
cn_pwd = rs(1) 
' ... 使用变量处理工作 
rs.movenext 
loop 
end if 
rs.close 
Set rs = Nothing
%> 




但在SQL语句或存储过程中改变了select列表的字段显示顺序,那么在赋值和处理时就要注意了。
////////////////////////////////////////////////////////////////////////////////////////
e.g:
select a,b,c from Test
那么
rs(0) <-> a
rs(1) <-> b
rs(2) <-> c

抽取10万条数据,想起GetRows() | 使用GetRows()提高执行效率 ( via )


现有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
%> 




耗时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
%> 
 



耗时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
%> 




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

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

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

参考一
GetRows 方法
将 Recordset 对象的多个记录恢复到数组中。

语法

array = recordset.GetRows( Rows, Start, Fields )

返回值

返回二维数组。

参数

Rows 可选,长整型表达式,指定要检索记录数。默认值为 adGetRowsRest (-1)。

Start 可选,字符串或长整型,计算得到在 GetRows 操作开始处的记录的书签。也可使用下列 BookmarkEnum 值。

常量 说明
AdBookmarkCurrent 从当前记录开始。
AdBookmarkFirst 从首记录开始。
AdBookmarkLast 从尾记录开始。
说明

使用 GetRows 方法可将记录从 Recordset 复制到二维数组中。第一个下标标识字段,第二个则标识记录号。当 GetRows 方法返回数据时数组变量将自动调整到正确大小。

如果不指定 Rows 参数的值,GetRows 方法将自动检索 Recordset 对象中的所有记录。如果请求的记录比可用记录多,则 GetRows 仅返回可用记录数。

如果 Recordset 对象支持书签,则可以通过传送该记录的 Bookmark 属性值,来指定 GetRows 方法将从哪个记录开始检索数据。

如要限制 GetRows 调用返回的字段,则可以在 Fields 参数中传送单个字段名/编号或者字段名/编号数组。

在调用 GetRows 后,下一个未读取的记录成为当前记录,或者如果没有更多的记录,则 EOF 属性设置为 True。
参考二 GetRows的用法详解!
其实这个属性很简单,就是把数据集输出到一个数组中。但是实用性可不小,在这里我举一个例子说明一下GetRows的使用方法,大家举一反三能想到更多的用法!

比如一个分类的表 T_Cate,结构和数据如下:

ID | Title | Intro
-----------------------------------------
1 | 新闻 | 这里是新闻
2 | 教程 | 这里是教程
3 | 下载 | 这里是下载

好了,表建立好了,数据也有了,下面我们就要用到GetRows咯!

代 码 :

Dim Rs_Cate
Dim Arr_Cate
Set Rs_Cate=Conn.ExeCute("SELECT ID,Title,Intro FROM T_Cate ORDER BY ID ASC")
Arr_Cate=Rs_Cate.GetRows
Set Rs_Cate=Nothing 




好了表数据已经导出到数组了!下面我们将遍历这个数组

代 码 :

Dim Arr_CateNumS,Arr_CateNumI
Arr_CateNumS=Ubound(Arr_Cate,2)  '得到数组中数据的下标
For Arr_CateNumI=0 To Arr_CateNumS
    Response.Write("ID:"&Arr_Cate(0,Arr_CateNumI)&" | 标题:"&Arr_Cate(1,Arr_CateNumI)&" | 介绍:"&Arr_Cate(2,Arr_CateNumI)&"<br>")
Next 




呵呵,好了,输出的数据为:
ID:1 | 标题:新闻 | 介绍:这里是新闻
ID:2 | 标题:教程 | 介绍:这里是教程
ID:3 | 标题:下载 | 介绍:这里是下载

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

最新评论及回复

最近发表

Powered By Z-Blog 1.8 Spirit Build 80710

Copyright 2007-2008 papozhe.com [asp教程] All Rights Reserved.
浙ICP备07030537号
免责申明:所有文章除特别声明,均来自网上,主要为学习用!内容仅供参考,版权归原作者。如侵犯您利益,请来信告知.
Email:papozhe$Gmail.com QQ:76336503