Avatar billede xion Nybegynder
21. juni 2000 - 20:47 Der er 4 kommentarer og
3 løsninger

Store søgninger giver timeout error

Når jeg på i en SQL 7.0 db. laver en stor søgning via et .asp script for jeg følgende fejl:

Microsoft OLE DB Provider for ODBC Drivers error '80040e31'

[Microsoft][ODBC SQL Server Driver]Timeout expired

Kan jeg komme udenom det ? Hvordan ?
Avatar billede lp Nybegynder
21. juni 2000 - 20:51 #1
Ja du kan ihvertfald udsætte timeout'en, men noget tyder på at din kode er ret uoptimeret siden den giver den, men det kan også være at timeout'en af en eller anden årsag er nedsat:

Server.ScriptTimeout=4000    'Giver 30 min. til at løre filen

/LP
Avatar billede lp Nybegynder
21. juni 2000 - 20:51 #2
det skal forøvrigt sættes HELT ØVERST i dit dokument....altså den aller første ASP linje....
løre betyder køre :-)

/LP
Avatar billede lrj Nybegynder
21. juni 2000 - 21:15 #3
Sørg for at din søgning laves af SQL-serveren og ikke i din ASP-kode. Det sidstnævnte er nemlig MEGET langsommere...
Avatar billede xion Nybegynder
21. juni 2000 - 22:47 #4
Her er koden, kan i se om det ser fornuftigt ud:

<%Server.ScriptTimeout=4000%>
<html>
<head>
    <title>:-)</title>
</head>

<BODY BGCOLOR="lightblue" TEXT="black" LINK="blue" ALINK="red" VLINK="navy">
<FONT FACE="verdana,arial,helvetica">

<A HREF="Default.asp">Find</A> &nbsp; <A HREF="Insert.asp">Insert</A> &nbsp; <A HREF="ProxyLog.asp">WEB Proxy Log</A> &nbsp; <A HREF="WinSockLog.asp">WinSock Proxy Log</A> &nbsp; <A HREF="Kontakt.asp">Kontakt</A> &nbsp; <A HREF="/stat/">Stat Admin</A> &nbsp;

<P>
<B><%=time()%> &nbsp; WinSock Proxy Log<BR>
<P>

<P>
Online users : <%=Application("NumbersOnline")%>
<P>

<div align="left">
<table border="0" cellspacing="0" width="654" height="150">
  <tr>
    <td width="200">
        <FORM ACTION="<%=Request.ServerVariables("SCRIPT_NAME")%>" METHOD="get" id=form1 name=form1>
        IP Address
        <INPUT TYPE="text" NAME="FindIP" VALUE="<%=request("FindIP")%>" SIZE="20">
    </td>
    <td width="200">
        User Name
        <INPUT TYPE="text" NAME="FindUsr" VALUE="<%=request("FindUsr")%>" SIZE="20">
    </td>
    <td width="200">
        Destination Host (Name)
        <INPUT TYPE="text" NAME="DestHN" VALUE="<%=request("DestHN")%>" SIZE="20">
    </td>
  </tr>
  <tr>
    <td width="200">
        Destination Host (IP)
        <INPUT TYPE="text" NAME="DestIP" VALUE="<%=request("DestIP")%>" SIZE="20">
    </td>
    <td width="200">
        Destination Host (Port)
        <INPUT TYPE="text" NAME="DestPort" VALUE="<%=request("DestPort")%>" SIZE="20">
    </td>
    <td width="200">
        Client Agent
        <INPUT TYPE="text" NAME="ClientAgent" VALUE="<%=request("ClientAgent")%>" SIZE="20">
    </td>
  </tr>
  <tr>
    <td width="200">
        <INPUT TYPE="submit" VALUE="Find" id=submit1 name=submit1>
        </FORM>
    </td>
  </tr>
</table>
</div>&nbsp;

<%
dim FindIP, FindUsr, DestHN, DestIP, DestPort, ClientAgent
    FindIP = request("FindIP")
    FindUsr = request("FindUsr")
    DestHN = request("DestHN")
    DestIP = request("DestIP")
    DestPort = request("DestPort")
    ClientAgent = request("ClientAgent")
   
    If FindIP <> "" Or FindUsr <> "" Or DestHN <> "" Or DestIP <> "" Or ClientAgent <> "" Or DestPort <> "" Then
   
        Set myConn = Server.CreateObject("ADODB.Connection")
        myConn.Open "DSN=DSN;UID=UID;PWD=PWD;DATABASE=IIS-Proxy;"

        SQL = "select * from MspWinSockLog where ClientIP Like '%" & FindIP & "%' And ClientUserName Like '%" & FindUsr & "%' And DestHost Like '%" & DestHN & "%' And DestHostIP Like '%" & DestIP & "%' And DestHostPort Like '%" & DestPort & "%' And ClientAgent Like '%" & ClientAgent & "%' Order By ClientIP Desc"
        Response.Write(SQL)%>

        <P>Du søgte efter <%Response.Write(FindIP & UserName)%><BR>
        Her er dine resultater:
        <P>
        <div align="left">
        <table border="1" cellspacing="0" width="100%">
        <tr>
            <td width="227">Log Time</td>
            <td width="227">User Name</td>
            <td width="227">Client Agent</td>
            <td width="227">Destination Host (name)</td>
            <td width="227">Destination Host (ip)</td>
            <td width="227">Destination Host (port)</td>
        </tr>
        </table>

        <%
        Set rs = myConn.Execute(SQL)
       
        If rs.EOF Then
            Response.Write("No results found!")
        End If
       
        While Not rs.EOF%>
            <div align="left">
            <table border="1" cellspacing="0" width="100%">
            <tr>
                <td width="227"><%Response.Write rs("LogTime")%></td>
                <td width="227"><%Response.Write rs("ClientUserName")%></td>
                <td width="227"><%Response.Write rs("ClientAgent")%></td>
                <td width="227"><%Response.Write rs("DestHost")%></td>
                <td width="227"><%Response.Write rs("DestHostIP")%></td>
                <td width="227"><%Response.Write rs("DestHostPort")%></td>
           
            <%
            ResultNr = ResultNr + 1
            rs.MoveNext
        Wend
        rs.Close
        Set rs = Nothing%>
        </tr>
        </table>
        <P>   
        <%
        Response.Write("Antal resultater i SQL query: " & ResultNr)
       
        myConn.Close
        Set myConn = Nothing
   
    End If
%>
</html>
Avatar billede xion Nybegynder
21. juni 2000 - 23:00 #5
Som i sikkert kan se har jeg også forsøget mig med tabeller, men ikke så vellykket :(
Avatar billede lp Nybegynder
22. juni 2000 - 02:17 #6
Det ser rimelig fornuftigt ud.....meeen alligevel ikke.....jeg vil mene du skal udskifte din SQL streng (søgestrengen) sådan at den opbygges efter hvad brugeren søger efter.......dvs søger han kun på FindUsr skal SQL opbygges til kun at inkludere den i strengen og ikke med de andre altid...de vil uden tvivl optimere en del....yderligere forklaring fra min side vil koste en del flere point :-)

/LP
Avatar billede lthrane Nybegynder
22. juni 2000 - 08:40 #7
Jeg tilslutter mig lp's kommentar mht. at oprette SQL på baggrund af hvad der søges efter.

Derudover har jeg denne kommentar:
Det er vist også kostbart rent tidsmæssigt at søge på
  data LIKE input

Hvis det er muligt, bør du udskifte til at søge på
  data = input

Jeg er ikke helt sikker på hvordan SQL server evaluerer WHERE, men jeg har før opnået reducering af tidsforbrug ved at flytte de betingelser der frasorterer flest records hen til sidst i WHERE betingelsen. Altså - hvis SQL server evaluerer fra højre, kan det måske give lidt.

lt
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester