webForumDet fria alternativet

Minimera antal recset?

ASP

3 svar · 356 visningar · startad av Troll

Medlem sedan dec. 2003229 inlägg
Frågan#1

Hejsan!

Håller på att bygga ett forum och har då en sida som listar ut de olika kategorierna, en beskrivning av kategorin, senaste inlägget osv osv...

Det känns dock som om att jag öppnar onödigt många recset och tänkte höra hur jag ska ändra min kod för att göra den så smidig som möjligt eftersom den jag har nu inte är allt för bra. Alla tips på hur man kan göra koden bättre är uppskattade!

Strippad från html...

Call dbOpen

  SQL1 =" SELECT fTitel, finfo, fID FROM tblForum WHERE fType = 1 ORDER BY fTitel ASC"
  Set objRS = objCon.Execute(SQL1)

Do While Not objRS.EOF
		  
Response.Write "<strong>"&objRS("fTitel")&"</strong>"

Response.Write "<br><i>"&objRS("fInfo")&"</i>"

  SQL2 =" SELECT TOP 1 Rubrik, Datum, FromUserID, ID, ResponseTo, Org FROM tblForumInlagg WHERE ForumID ="&objRS("fID")&" ORDER BY Datum DESC"
  Set objRS2 = objCon.Execute(SQL2)
  							IF objRS2.EOF THEN
								Response.Write "<br><i>Det finns inga poster i detta forum</i><br>"
							End if
							
						Do While Not objRS2.EOF
						
						If objRS2("ResponseTo") = 0 Then
						strResponseTo = objRS2("ID")
						Else
						strResponseTo = objRS2("ResponseTo")
						End If
  
Response.Write ""&objRS2("Datum")&"<br>"
Response.Write "<a href='forumread.asp?fID="&objRS("fID")&"&pID="&strResponseTo&"#"&objRS2("ID")&"'>"&objRS2("Rubrik")&"</a><br>"

'-----------------------------
strSQL8 = "SELECT COUNT(*) AS antalTrad FROM tblForumInlagg WHERE ForumID ="&objRS("fID")&" AND Org = 1"
Set objRS8 = objCon.Execute(strSQL8)
Response.Write "" & objRS8("antalTrad") & ""
objRS8.Close
Set objRS8 = Nothing
'-----------------------------

'-----------------------------
strSQL9 = "SELECT COUNT(*) AS antalInlagg FROM tblForumInlagg WHERE ForumID ="&objRS("fID")&""
Set objRS9 = objCon.Execute(strSQL9)
Response.Write "<br>" & objRS9("antalInlagg") & ""
objRS9.Close
Set objRS9 = Nothing
'-----------------------------

			objRS2.MoveNext
			Loop

objRS.MoveNext
Loop

objRS.Close
Set objRS = Nothing
objRS2.Close
Set objRS2 = Nothing

Call dbClose

Valde att inte kommentera koden eftersom det antagligen inte behövs men är något oklart så fråga. Känns bara som om att den är helt fel :/

Medlem sedan dec. 19996 721 inlägg
#2

Det är inte så tokigt alls egentligen, men du kan prova med

SELECT f.fTitel, f.finfo, f.fID, COUNT(CASE WHEN i.Org=1 THEN i.ID ELSE NULL END CASE) AS antalTrad, COUNT(i.ID) AS antalInlagg FROM tblForum f LEFT JOIN tblForumInlagg i ON f.fID=i.ForumID WHERE f.fType = 1 GROUP BY f.fTitel, f.finfo, f.fID ORDER BY f.fTitel ASC

...för att slippa objRS8 och objRS9

objRS2 är i princip nödvändig, om man inte gör en helskruvad SQL-fråga (se nedan), men du behöver ingen DISTINCT och ingen while-loop, eftersom du bara plockar ut ett inlägg.

Skruvad fråga (som kanske kan bli långsam om det är många inlägg):

SELECT f.fTitel, f.finfo, f.fID, fi.Rubrik, fi.Datum, fi.FromUserID, fi.ID, fi.ResponseTo, fi.Org, COUNT (
    CASE 
        WHEN i.Org=1 
        THEN i.ID 
        ELSE NULL 
    END CASE 
    ) AS antalTrad, COUNT(i.ID) AS antalInlagg 
    FROM tblForum f 
    LEFT JOIN tblForumInlagg i 
        ON f.fID=i.ForumID 
    LEFT JOIN 
        (SELECT ForumID,MAX(ID) AS ID 
        FROM tblForumInlagg 
        GROUP BY ForumID
        ) 
        mi 
        ON f.fID=mi.ForumID 
    LEFT JOIN 
        (SELECT Rubrik, Datum, FromUserID, ID, ResponseTo, Org 
        FROM tblForumInlagg
        ) 
        fi 
        ON mi.ID  =fi.ID 
    WHERE f.fType = 1 
    GROUP BY f.fTitel, f.finfo, f.fID, fi.Rubrik, fi.Datum, fi.FromUserID, fi.ID, fi.ResponseTo, fi.Org 
    ORDER BY f.fTitel ASC

Har utgått från att du kör MySQL 4.1 eller senare

Medlem sedan dec. 2003229 inlägg
#3

Oh, den var skruvad :D

Åhå, så den var inte helt fel endå? Tack så mycket :)

Medlem sedan feb. 200520 inlägg
#4

Något jag lärde mig den hårda vägen är att det lätt blir segt när man har många recordsets öppna samtidigt och loopar i loopar. Speciellt om

Jag hämtade allt jag skulle ha från recordseten och stoppade in i arrays med GetRows, sen kunde jag stänga recordsetet (och connection?) och loopa igenom arrayen i stället. Mycket resurssparande vad jag har förstått eftersom det tar på krafterna när webbservern ska kommunicera med databasservern.

260 ms totalt · 4 externa anrop · v20260731065814-full.86ec41c2
123 ms — deklarationer (db)
0 ms — hämta statistik (cache)
132 ms — hämta tråd, inlägg och bilagor (db)
125 ms — ändringar (db)