加快页面加载速度

时间:2011-07-13 06:28:26

标签: sql arrays vbscript asp-classic

我有一个2D数组,其中填充了数据库中的数据,然后在while循环中使用另一个sql查询。对于while循环中的每个项目,我使用for循环检查2d数组中的某些项目。

如何加快速度,因为while循环中的项目在1000 - 2000项内,加载网页需要3-4秒。

这是我的2D阵列 -

'MultiDimensional Array
Dim permissionsArray()
Dim permissionsCount  
connectionstring = obj_ADO.getconnectionstring  
Increment = 1             

set c = CreateObject("ADODB.Connection")
set r = CreateObject("ADODB.Recordset")
c.open connectionstring
SQL = "select Count(P_Name) as permissionsCount from l_objectpermission inner join A_Permission on op_permissionID = P_permissionID"
r.open SQL, c
permissionsCount = r("permissionsCount")

r.close
c.close


Set objCon = CreateObject("ADODB.Connection")
Set objRS = CreateObject("ADODB.Recordset")
objCon.Open connectionstring

SQL = "select OP_ObjectID, P_Name from l_objectpermission inner join A_Permission on op_permissionID = P_permissionID order by P_Name"

objRS.open SQL, objCon
Redim permissionsArray(2, permissionsCount)
if not objRS.EOF then                                            
    objRS.MoveFirst
    while not objRS.EOF                   

        permissionsArray(0, increment) = objRS("OP_ObjectID")
        permissionsArray(1, increment) = objRS("P_Name")

        objRS.MoveNext
        Increment = Increment + 1
    wend

    objRS.close
    objCon.close

end if

在我的while循环中是 -

        Page_ID = objRS("P_PageID")
        for i = 0 to (permissionsCount)
            if permissionsArray(0, i) = Page_ID then
                %>
                <li style="height: 2px;">
                <%=permissionsArray(1,i)%>
                </li>
                </br>
                <%
            end if                        
        next   
        %>
        </div></center></td>

2 个答案:

答案 0 :(得分:5)

这是你的瓶颈:

if not objRS.EOF then                                            
    objRS.MoveFirst
    while not objRS.EOF 

如果您想要的只是一个二维数组,那么您将使用Recordset.GetRows()代替

'MultiDimensional Array
Dim permissionsArray
Dim permissionsCount  
connectionstring = obj_ADO.getconnectionstring               

Set c = Server.CreateObject("ADODB.Connection")
Set r = Server.CreateObject("ADODB.Recordset")
r.CursorLocation = 2 'adUseServer
c.open connectionstring
c.CursorLocation = 2 'adUseServer

SQL = "select OP_ObjectID, P_Name from l_objectpermission inner join A_Permission on op_permissionID = P_permissionID order by P_Name"

Set r = Server.CreateObject("ADODB.Recordset")
r.CursorLocation = 2 'adUseServer
r.Open SQL, c, 0, 1 'adOpenForwardOnly, adLockReadOnly
If r.BOF or r.EOF Then
   r.close()
   Set r = Nothing
Else
   permissionsArray = r.GetRows()
   permissionsCount = UBound(permissionsArray, 2) + 1
   r.Close()
   Set r = Nothing
End If
c.Close()
Set c = Nothing

参考文献:
http://www.learnasp.com/advice/whygetrows.asp
http://www.w3schools.com/ado/met_rs_getrows.asp
http://www.devguru.com/technologies/ado/quickref/recordset_getrows.html

答案 1 :(得分:3)

假设问题与ADODB方面有关,而不是你试图渲染2000&lt; LI&gt; ...

重用ADODB.Connection通常是一种好习惯。关闭连接然后重新打开它可能会使您的性能略有下降。

您还应该指定RecordSet属性(在打开RecordSet之前):

  1. CursorLocation:adUseServer [2]在服务器上运行游标;服务器以块的形式将记录集流式传输到客户端,允许客户端更快地开始处理,而不是等到收到整个集合;此外,内存在服务器上进行管理,因此如果很多人同时点击该页面,您将不会在客户端上出现内存问题; http://msdn.microsoft.com/en-us/library/ee252442(v=bts.10).aspx

  2. LockType:adLockReadOnly [1]表示无法更改数据的只读记录;如果你不改变数据,这应该是最快的; http://msdn.microsoft.com/en-us/library/ee252458(v=BTS.10).aspx

  3. CursorType:adOpenForwardOnly [0]指定此值将打开仅向前类型的游标。此CursorType与静态游标相同,只是您只能向前滚动记录。当只需要一次通过Recordset时,这可以提高性能。 http://msdn.microsoft.com/en-us/library/ee252445(v=BTS.10).aspx

  4. 你也应该摆脱“计数”查询...除非你出于其他原因需要它。否则,你可以设置permissionsCount = UBOUND(permissionsArray)的值......我想......自从我做了任何vbscript以来已经很久了!

    SQL = "select OP_ObjectID, P_Name from l_objectpermission inner join A_Permission on op_permissionID = P_permissionID order by P_Name"
    
    Set rs = Server.CreateObject("ADODB.RecordSet")
    rs.CursorLocation = 2 'adUseServer
    rs.LockType = 1 'adLockReadOnly
    rs.CursorType = 0 'adOpenForwardOnly
    rs.ActiveConnection = c
    rs.Open SQL
    
    If NOT rs.EOF Then
       permissionsArray = rs.GetRows()
    End If
    
    rs.close()
    Set rs = Nothing
    c.Close()
    Set c = Nothing