Ускорение загрузки страницы - PullRequest
0 голосов
/ 13 июля 2011

У меня есть 2D-массив, который заполняется данными из базы данных, которая затем используется в цикле while с другим SQL-запросом. Для каждого элемента в цикле while я проверяю определенные элементы в массиве 2d, используя цикл 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>

Ответы [ 2 ]

5 голосов
/ 13 июля 2011

Вот ваша горлышко бутылки:

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

3 голосов
/ 13 июля 2011

Предполагается, что проблема связана со стороной ADODB, а не с фактом, что вы пытаетесь отобразить 2000

s ...

Как правило, хорошей практикой является повторное использование вашего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 идентичен статическому курсору, за исключением того, что вы можете только прокручивать записи вперед.Это повышает производительность, когда требуется только один проход через набор записей.http://msdn.microsoft.com/en-us/library/ee252445(v=BTS.10).aspx

Вам также следует избавиться от запроса "count" ... если только он вам не нужен по какой-либо другой причине.В противном случае вы можете установить значение 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

...