zoukankan      html  css  js  c++  java
  • ASP大数据量使用GetRows()提升速度

    抽取10万条数据,Access数据库,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)就表示记录集第一行的第二字段值
    
    数组的数据是保存在内存中的,这就从根本上解决了每次显示记录还需向数据库请求的麻烦。
    
    关于GetRows()的介绍
    
    ADO也提供更有效率方法来取得数据。GetRows 方法传回一个二维的数组变量,每一行对应Recordset中的一笔记录,且每一列对应到记录中的字段。此方法的语法如下:
    
    varArray = rs.GetRows([Rows], [Start], [Fields])
    
    Rows 是要读取记录的数量;如果想要取得Recordset所有记录,可用-1或省略此参数。Start 是指出第一个被读取记录的书签;也可以是下列列举常数中的一个:0-adBookmarkCurrent(目前记录)、1-adBookmarkFirst(第一笔记录)、或2-adBookmarkLast(最后记录)。
    
    Fields 是可选择的字段名称数组,其用来限制要读取的数据量。(也可指定单一字段名称、单一字段索引、或者一个字段索引数组)。当设定 Rows 为少于Recordset记录笔数时,第一笔未读取的记录变成现行记录。若省略 Rows 参数或设定为-1-adGetRowsRest或大于未读取的笔数时,GetRows 方法会读取所有记录并让Recordset在EOF状态,而不会产生任何错误。
    
    当处理目的变量数组的数据时,应该记得数据储存方式是有点相反的感觉:数组中第一维定义Recordset的字段(数据行),第二维定义Recordset的数据列。
    
    GetRows 方法通常比一次读一笔记录的循环要来得快些,但使用这方法时,必须确定Recordset未包含太多记录;否则,会很容易以一个非常大的变量数组来填满所有内存。基于相同的原因,得小心不要包括任何BLOB(Binary Large Object)或CLOB(Character Large Object)字段;若如此做的化,应用程序一定会爆掉,特别是对于较大的Recordset而言。最后,记住此方法传回的变量数组是以0为基底的;传回记录的笔数是UBound(values,2)+1,传回字段数是UBound(value, 1)+1。
    
    
    抽取10万条数据,Access数据库,GetRows()
    

      

  • 相关阅读:
    LeetCode——Generate Parentheses
    LeetCode——Best Time to Buy and Sell Stock IV
    LeetCode——Best Time to Buy and Sell Stock III
    LeetCode——Best Time to Buy and Sell Stock
    LeetCode——Find Minimum in Rotated Sorted Array
    Mahout实现基于用户的协同过滤算法
    使用Java对文件进行解压缩
    LeetCode——Convert Sorted Array to Binary Search Tree
    LeetCode——Missing Number
    LeetCode——Integer to Roman
  • 原文地址:https://www.cnblogs.com/uuxanet/p/3284908.html
Copyright © 2011-2022 走看看