• 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列表的字段显示顺序,那么在赋值和处理时就要注意了。

    4,当然,使用GetRows()又是另外一回事了

    现有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)就表示记录集第一行的第二字段值

    数组的数据是保存在内存中的,这就从根本上解决了每次显示记录还需向数据库请求的麻烦。
  • 相关阅读:
    redis在linux下的安装
    Redis在系统中的使用
    使用ServiceStackRedis操作redis
    Redis命令
    mongo增删改操作
    mongo c#驱动介绍操作
    LeetCode 19 删除链表的倒数第N个节点
    LeetCode 01 两数之和
    metapath2vec 笔记
    Q&A(一)
  • 原文地址:https://www.cnblogs.com/rooney/p/1402963.html
Copyright © 2020-2023  润新知