Сильно томозит скрипт/sql

Программирование на Active Server Pages и VBScript.
Orastar
Начинающий
Начинающий
 
Сообщения: 17
Зарегистрирован: 29.11.2004 (Пн) 15:41

Сильно томозит скрипт/sql

Сообщение Orastar » 25.01.2005 (Вт) 13:52

Есть такой скрипт. Очень сильно тормозит (15-20 секунд), подозреваю что из-за вложенных циклов и грешу больше на MSSQL. Полдскажите пожалйста как можно его оптимизировать?

<%
Set conn = Server.CreateObject("ADODB.Connection")
set rs = Server.CreateObject("ADODB.recordset")
set rs2 = Server.CreateObject("ADODB.recordset")
Conn.ConnectionTimeout = "25"
Conn.Provider = "sqloledb"
Conn.Properties("Initial Catalog").Value = "MyBase"
Conn.Properties("Integrated Security").Value = "SSPI"
Conn.Open
sql1="SELECT * FROM CategoryView"
%>
<div id="WS-menu" onClick="controlExpand()">
<%
rs.Open sql1, conn
do until rs.EOF
Category=rs("Category")
%>
<div class="category" id = "<%=rs("id")%>" style="cursor:hand"><%=Category%></div>
<div class="sub-category" id="<%=rs("id")%>Sub" style="display:none">
<%
sql2="SELECT * FROM SubCategoryView Where Category='" & rs("Category") & "'"
rs2.Open sql2, conn
do until rs2.EOF
%>

<div><a href="catalog.asp?catid=<%=rs2("id")%>"><%=rs2("SubCategory")
%></a></div>
<%
rs2.MoveNext
Loop
rs2.Close
%>
</div>
<%
rs.MoveNext
Loop
rs.Close
%>

Orastar
Начинающий
Начинающий
 
Сообщения: 17
Зарегистрирован: 29.11.2004 (Пн) 15:41

Сообщение Orastar » 25.01.2005 (Вт) 14:47

Все, спасибо. Разобрался сам.

skiperski
Идеолог
Идеолог
Аватара пользователя
 
Сообщения: 1386
Зарегистрирован: 25.06.2002 (Вт) 15:52

Сообщение skiperski » 25.01.2005 (Вт) 15:56

Тут принято, в таких случаях, пояснять в чём была трабла, и как это лечится.

Orastar
Начинающий
Начинающий
 
Сообщения: 17
Зарегистрирован: 29.11.2004 (Пн) 15:41

Сообщение Orastar » 25.01.2005 (Вт) 16:15

Извиняюсь, не знал.
Достаточно было просто указать тип курсора и тип блокировки
Вместо rs.Open sql1, conn
прописал
rs.Open sql1, conn, 3, 1

И все стало нормально.

skiperski
Идеолог
Идеолог
Аватара пользователя
 
Сообщения: 1386
Зарегистрирован: 25.06.2002 (Вт) 15:52

Сообщение skiperski » 25.01.2005 (Вт) 17:12

Если выискивать блох, то:

1. Ещё лучше
Код: Выделить всё
Const adOpenForwardOnly = 0
Const adLockReadOnly = 1
rs.Open sql1, conn, adOpenForwardOnly, adLockReadOnly

2. Выбирать только необходимые поля
Код: Выделить всё
   sql1="SELECT id, Category FROM CategoryView"
...
      sql2="SELECT id, SubCategory FROM SubCategoryView Where Category='" & rs("Category") & "'"


3. Переделать во второй базе ссылку на родительскую категорию со строковой на численную и привязать не к имени, а к id.

4. Для первого цикла использовать отсоединённый Recordset
Код: Выделить всё
Const adOpenKeyset = 1
Const adOpenStatic = 3
'здесь можно использовать оба типа и adOpenKeyset, и adOpenStatic
rs.Open sql1, conn, adOpenKeyset, adLockReadOnlySet rs.ActiveConnection = Nothing
Do Until rs.EOF
...
Loop

или массив значений
Код: Выделить всё
Erase arr
rs.Open sql1, conn, adOpenForwardOnly, adLockReadOnly
If (Not rs.EOF) Then arr = rs.GetRows()
rs.Close
For i = 0 To Ubound(arr)
    Id = arr(i, 0)
    Caption = arr(i, 1)
    ...
Next

Cyrax
Cyberninja
Cyberninja
Аватара пользователя
 
Сообщения: 891
Зарегистрирован: 25.04.2002 (Чт) 21:20
Откуда: Magnitogorsk, Russia

Сообщение Cyrax » 31.01.2005 (Пн) 10:22

немного дополню skiperski
специально для asp-разработчиков MS создала несколько include-файлов с описаниями всех констант библиотеки ADODB - adovbs.inc (VBScript) и adojavas.inc (JScript). найти эти файлы можно в каталоге "C:\Program Files\Common Files\System\ado".
нужный файл копируется в каталог с ASP-приложением и #includ'ится в asp-страницу, в которой будут использоваться константы, описанные в нем.
Ты это ему расскажи. Я уже пять болтов отвинтил, и конца не видно... (озадаченно) А это в какую сторону тянуть? Ну-ка... Ага, этот был лишний, этот вообще не отсюда, и этот... Точно, два болта.

Welcome to IRC


Вернуться в ASP и VBScript

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 22

    TopList