Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 加速页面加载_Sql_Arrays_Vbscript_Asp Classic - Fatal编程技术网

Sql 加速页面加载

Sql 加速页面加载,sql,arrays,vbscript,asp-classic,Sql,Arrays,Vbscript,Asp Classic,我有一个2D数组,其中填充了数据库中的数据,然后在另一个sql查询的while循环中使用。对于while循环中的每个项目,我将使用For循环检查二维数组中的某些项目 由于while循环中的项目在1000-2000个项目范围内,加载网页需要3-4秒,因此如何加快速度 这是我的2d阵列- 'MultiDimensional Array Dim permissionsArray() Dim permissionsCount connectionstring = obj_ADO.getconnect

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

由于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>
Page\u ID=objRS(“P\u PageID”)
对于i=0至(许可证)
如果permissionsArray(0,i)=页面ID,则
%>
高度:2px;“>



这是你的瓶颈:

if not objRS.EOF then                                            
    objRS.MoveFirst
    while not objRS.EOF 
如果您只需要一个二维数组,那么可以使用Recordset.GetRows()代替

参考文献:



假设问题与ADODB方面有关,而不是您试图渲染2000
  • 的事实

    通常,重用ADODB.Connection是一种很好的做法。关闭连接,然后重新打开,可能会稍微降低性能

    还应指定记录集属性(在打开记录集之前):

  • CursorLocation:adUseServer[2]在服务器上运行光标;服务器将记录集以数据块的形式流式传输到客户机,使客户机能够更快地开始处理,而不是等待整个记录集被接收;此外,内存是在服务器上管理的,因此如果有很多人同时访问页面,那么客户端上就不会出现内存问题

  • LockType:adLockReadOnly[1]表示数据不能更改的只读记录;如果你没有改变数据,这应该是最快的

  • CursorType:adOpenForwardOnly[0]指定此值将打开一个仅向前类型的光标。此游标类型与静态游标相同,只是您只能向前滚动记录。当只需要通过记录集一次时,这将提高性能。

  • 您还应该摆脱“count”查询……除非您出于其他原因需要它。否则,您可以设置permissionscont=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
    


    @Sean:
    Redim permissionsArray(22000)
    绝对不是一个昂贵的电话!试试看-1表示错误诊断,除非/直到你能证明我错了,或者你删除了该声明。@Jean-François Corbett,只有当数组已满且使用了
    Preserve
    关键字时,你才是正确的。这里昂贵的调用是Recordset.MoveNext和Recordset.EOF,就像在循环中一样,每当Recordset.GetRows完成相同的任务时,都会调用它们。@Sean:没错。这就是你应该在答案中指出的--1这是一个侧重点,但在我看来,您只需要
    permissionsArray
    维度1中的索引0到1,即
    Redim permissionsArray(1,permissionscont)
    。出于好奇……最终结果是什么?您是否能够减少页面加载时间?PermissionScont=UBOUND(permissionsArray)+1,但在其他方面是完美的。我的代码被设置为adUseClient,因为它是从一些用于连接MySQL数据库的旧代码修改而来的。。。
    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