2011-07-13 60 views
0

我有一个二维数组,填充数据库中的数据,然后在另一个SQL查询的while循环内使用。对于while循环中的每个项目,我使用for循环检查2d数组内的某些项目。加快页面加载

如何加速这一点,因为while循环内的项目是在1000 - 2000项目内,并需要3 - 4秒来加载网页。

这里是我的二维数组 -

'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> 
+0

这是一个侧面点,但在我看来,你只需要指数0到1'permissionsArray',即'REDIM permissionsArray(1,permissionsCount)'的尺寸1。 –

+0

出于好奇...结果是什么?你能减少你的页面加载时间吗? – uhleeka

回答

3

假设问题是与事物的ADODB一边做,而不是事实,你正试图使2000 <李>的。 ..

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

还应该指定记录集属性(被打开记录前):

  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

你也应该摆脱“数”查询的......除非你需要它的一些其他原因。否则,你可以设置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 

+1

permissionsCount = UBOUND(permissionsArray)+ 1,但在其他方面完美无瑕。我的代码被设置为adUseClient,因为它修改了一些用于连接到MySQL数据库的旧代码。 –

5

这里是你的瓶颈:

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

如果你想要的是一个2维数组,则您将使用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

+0

+1用于重新使用ADODB.Connection。 – uhleeka

+0

@Sean:'Redim permissionsArray(2,2000)'绝对不是一个昂贵的电话!试试看。 -1除非/直到你能证明我错了或你删除了这个说法,否则你的诊断不好。 –

+0

@ Jean-FrançoisCorbett,只有当数组已满并且使用了“Preserve”关键字时,您才是正确的。这些昂贵的调用是Recordset.MoveNext和Recordset.EOF,因为在循环中它们每次都被调用,Recordset.GetRows完成相同的任务。 –