webForumDet fria alternativet

ASP/MySQL: Loop. Timeout...

7 svar · 688 visningar · startad av oskars

oskarsMedlem sedan nov. 20051 317 inlägg
#1

Tjenare!

Kunde inte sätta en bra rubrik.

Jag har en MySQL-databas där jag har indexerat följande kolumner:
new_Start, new_Slut, File, Fram, Retur, Tio och Femton.

Så här ser min kod ut:

<%
	Session.LCID = 1053
	Server.ScriptTimeout = 1200
	Response.Buffer = False

	Set Connect=server.createObject("ADODB.Connection")
	Connect.Open = "DRIVER={MySQL ODBC 3.51 Driver}; SERVER=mysql.host.blabla; DATABASE=; UID=;PASSWORD=; OPTION=3"
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>TAXI 2009</title>
</head>
<body style="font-family:Courier;background-color:#DDD;">

<form method="post" action="?do=find">
<table>		
	<tr>
		<td><b>Stad</b></td>
		<td><b>Starttid (HH:MM)</b></td>
		<td><b>Veckodag</b></td>
	</tr>
	<tr>
		<td>
			<select name="stad" style="font-family:Courier;">
				<option>Välj stad...</option>
				<option></option>
				<option value="1">Lidköping</option>
				<option value="2">Skara</option>
			</select>
		</td>
		<td><input name="starttid" type="text" style="font-family:Courier;" /></td>
		<td>
		<!--
			<select name="veckodag" disabled style="font-family:Courier;">
				<option>Välj veckodag...</option>
				<option></option>
					<option value="0">Måndag</option>
					<option value="1">Tisdag</option>
					<option value="2">Onsdag</option>
					<option value="3">Torsdag</option>
					<option value="4">Fredag</option>
					<option value="5">Lördag</option>
					<option value="6">Söndag</option>
			</select>
		-->
		</td>
		<td><input type="submit" value="Sök" style="font-family:Courier;" /></td>
	</tr>
</table>	
</form>
<div style="font-size:7px;">
<%

If Request.Querystring("do") = "find" Then

	Starttid = FormatDateTime(""&Request.Form("starttid")&"", vbShortTime)
	Starttiden = Starttid
	
	' Den ska loopa igenom dag för dag (måndag - söndag) 0 = Måndag, osv.
	For minDag = 0 to 6
	
	Response.Write("<table>")
	
	' Vi ska hitta alla som inte är Kund=1,696,210, och inga bussar... och där stad är som angivet i formuläret, samt Weekday = minDag från For-loopen här ovan.
	Set RecSet = Server.CreateObject("ADODB.Recordset")
	RecSet.Open "Select DISTINCT Startdatum From LIDSK WHERE NOT Kundnr IN(1,696,210) AND NOT Bussar = 1 AND Stad = "&Request.Form("stad")&" " & _
	"AND Weekday(new_Start) = "&minDag&"", Connect, 3, 3
	
	' Gör korrekt format av Startdatum från recordsettet ovan
	Dagen = RecSet("Startdatum")
	Dagen = Left(Dagen,4) & "-" & Left(Right(Dagen,4),2) & "-" & Right(Dagen,2)
	
	' Denna raden printar bara ut en rubrik
	Response.Write "<tr><td>" & WeekdayName(Weekday(Dagen)) & "ar " & Starttid  &" +30min" & "</td></tr>"
	
	' Nu loopar vi igenom recsettet ovan.
	Do Until RecSet.EOF
	
	' Gör korrekt format av Startdatum.. igen? Dumt... men så är det iaf.
	dennaDagen = RecSet("Startdatum")
	dennaDagen = Left(dennaDagen,4) & "-" & Left(Right(dennaDagen,4),2) & "-" & Right(dennaDagen,2)
	
	
		' Print ut datumet i vänstra kolumnen
		Response.Write "<tr><td>" & dennaDagen & "</td>"
	
		' Nu ska vi loopa ut varje minut fr.o.m det klockslaget som angavs i formuläret "starttid".  T.ex 12:00 ska loopas fram till 12:30, minut för minut.
		For Tal = 1 to 31
		
			' Här fulmeckar jag lite... kommer inte ihåg exakt varför.
			If Tal = 1 Then
				Starttid = FormatDateTime(Starttid)
			Else
				Starttid = DateAdd("n",1,Starttid)
			End If
			
			' Fulmecka lite format etc...
			Starttid = FormatDateTime(Starttid, vbShortTime)
			Startdatum = RecSet("Startdatum")
			Startdatum = Left(Startdatum,4) & "-" & Left(Right(Startdatum,4),2) &"-"& Right(Startdatum,2)
			Starttid2 = FormatDateTime(Startdatum,2) & " " & FormatDateTime(Starttid, vbShortTime) 
			
			' Här räknar vi hur många rader som har denna minuten (från For-loopen) mellan klockslagen i new_Start och new_Slut.
			Set RecSet2 = Server.CreateObject("ADODB.Recordset")
			RecSet2.Open "SELECT COUNT(*) AS RecSetAntal FROM LIDSK " & _
			"WHERE NOT Kundnr IN(1,696,210) AND NOT Bussar = 1 AND Stad = "&Request.Form("stad")&" " & _
			"AND '"&Starttid2&"' BETWEEN LIDSK.new_Start AND LIDSK.new_Slut", Connect, 3, 3
		
			' Lite meckande som jag inte kommer ihåg exakt varför jag skrev.
			If Tal = 1 Then
				mittAntal = RecSet2(0)
			End If
			
			If CInt(RecSet2("RecSetAntal")) > CInt(mittAntal) Then
				mittAntal = RecSet2(0)
			End If
			
			' Printa ut resultat av ovanstående SQL-sats gav OM DET ÄR DEN SISTA MINUTEN SOM LOOPATS FRAM.
			If Tal = 31 Then
				Response.Write "<td>" & mittAntal & "</td></tr>"
				Starttid = Starttiden
			End If

		' Gå vidare till nästa minut.
		Next
					
	
	RecSet.MoveNext
	Loop
	
	Response.Write("</table>")
	
	' Gå vidare till nästa dag.
	Next
	
End If	
%>
</div>
</body>
</html>

Problemet är att loopen (eller SQLen?) låser sig ibland... vet ej varför... ser ej någon logisk förklaring till det... Det är 190.000st poster i databasen, men den räknar inte igenom alla. En lustig grej är att om man kör samma sökning två gånger så går det jättesnabbt andra gången (antar att det är för att indexet lärt databasen vart datan ligger, eller något sånt?).

Problemet är som sagt att den låser sig typ 3-4st gånger per sökning. Vet inte om den just "låser sig", men den tar väldigt lång tid efter ett par sökningar av minuter... så lång tid att den gör timeout till slut...

Är ju inte direkt den mest optimala eller bästa prestanda lösningen jag har här... det vet jag... men har ingen annan lösning på problemet (Stort tack till Peter_S som hjälpte mig med mitt tidigare problem i en annan tråd).

Tacksam för hjälp!

Mvh
Oskar

KrikoMedlem sedan dec. 2006382 inlägg
#2

Vet inte om det har med saken att göra, men du borde faktiskt stänga dina recordsets efter dig.
Vet som sagt inte om det kan ha med detta att göra.

oskarsMedlem sedan nov. 20051 317 inlägg
#3

Kriko skrev:

Vet inte om det har med saken att göra, men du borde faktiskt stänga dina recordsets efter dig.
Vet som sagt inte om det kan ha med detta att göra.

Tack för tipset! Men det behöver jag väl inte göra i loopen, utan det räcker väl på slutet av sidan?

TroxyMedlem sedan mars 20041 505 inlägg
#4

oskars skrev:

Tack för tipset! Men det behöver jag väl inte göra i loopen, utan det räcker väl på slutet av sidan?

Tänk efter nu! :p
Du öppnar ju RecSet2 inuti loopen för varje varv, men stänger det aldrig.

oskarsMedlem sedan nov. 20051 317 inlägg
#5

Troxy skrev:

Tänk efter nu! :p
Du öppnar ju RecSet2 inuti loopen för varje varv, men stänger det aldrig.

Du har helt klart rätt! Ska se till att stänga dom! Tack för tipset!

Något mer ni kan se?

EclipseMedlem sedan juli 20003 825 inlägg
#6
n "Select DISTINCT Startdatum From LIDSK WHERE NOT
 Kundnr IN(1,696,210) AND NOT Bussar = 1 AND 

Stad = " & Request.Form("stad") & " " & _

Enkelfjumpar?

Stad = 'nässjö'

Dock! Jag vet inte hur noga det är i MySQL...

oskarsMedlem sedan nov. 20051 317 inlägg
#7

Eclipse skrev:

n "Select DISTINCT Startdatum From LIDSK WHERE NOT
 Kundnr IN(1,696,210) AND NOT Bussar = 1 AND 

Stad = " & Request.Form("stad") & " " & _

Enkelfjumpar?

Stad = 'nässjö'

Dock! Jag vet inte hur noga det är i MySQL...

Njaeh, stad är ju lika med 1 eller 2... med andra ord så är Stad bara siffror! :)

OveRRidEMedlem sedan feb. 200112 078 inlägg
#8

Eclipse skrev:

Stad = 'nässjö'

OMG! :o Var du tvungen att ta den hålan som exempel?

133 ms totalt · 3 externa anrop · v20260731065814-full.0e50b1ef
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
129 ms — hämta tråd, inlägg och bilagor (db)