webForumDet fria alternativet

Menyproblem

2 svar · 363 visningar · startad av Asa

AsaMedlem sedan dec. 20011 860 inlägg
#1

Använder en treeviewmeny som funkar fint. Men nu är det så att det är väldigt mycket data som hämtas så den blir väldigt seg. En vän sa nåt att man skulle göra så att:

skapa en cache. lagra ett "dictionary object" i Application-object ...

Men hur gör man det?

Koden för det som skriver ut menyn:

	<script type="text/javascript">
		<!--
		d = new dTree('d');
		d.add(0,-1,'');

		<%Function Meny(Conn, HuvudId)
		  Set RS = Conn.Execute("SELECT * FROM tbl_prodkat WHERE ukategori = " & HuvudId & " order by kategori")
		    If Not RS.EOF Then
      		      Do Until RS.EOF
  		        strID   = RS("pkID")
   		        strNamn = RS("kategori") 
   		        strUID  = RS("ukategori") 
                        Set Check = Conn.Execute("SELECT * FROM tbl_prodkat WHERE ukategori = " & strID)
	                  If Not Check.EOF Then%>
         	            d.add(<%=strID%>,<%=strUID%>,'<%=strNamn%>','produkt.asp?kat=<%=strID%>','<%=strNamn%>','','','','');
                          <%Else%>
         	            d.add(<%=strID%>,<%=strUID%>,'<%=strNamn%>','produkt.asp?kat=<%=strID%>','<%=strNamn%>','','','','');
                          <%End If
			  Check.CLose:Set Check=Nothing
          	        Meny Conn, strID
        	      RS.MoveNext
       		      Loop
   		    End If
 		  RS.Close:Set RS=Nothing
		End Function

                Meny Conn, 0%> 

		document.write(d);
		//-->
	</script>

Menyn hämtad härifrån:
http://www.destroydrop.com/javascripts/tree/

emissionMedlem sedan dec. 19996 721 inlägg
#2

1. Hämta inte med "SELECT *", utan plocka bara ut det som behövs
2. If RS.EOF körs i onödan
3. Check-funktionen ska du hoppa över, eftersom du inte verkar bry dig om resultatet.

Möjliga optimeringar:

4. Fråga databasen direkt om det finns några "barn", så att frågan inte måste köras i onödan.

Ex (kan göras med subselect också)

SELECT k1.pkID,k1.kategori,k1.ukategori,COUNT(k2.pkID) as antalBarn
FROM tbl_prodkat k1
LEFT OUTER JOIN tbl_prodkat k2 ON k2.ukategori=k1.pkID
GROUP BY k1.pkID,k1.kategori,k1.ukategori

och

if antalBarn>0 then
   Meny Conn, strID
end if

5. Hämta ut alla kategorier i ett stort recordset och använd Filter-egenskapen för att söka. Metoden är egentligen inte så snabb, men det beror på vad man jämför med.

RS.Filter="ukategori = " & strID

6. Spara nodstrukturen i annat format i Application, helst som en sträng. Man bör undvika att lagra ett Dictionary i Application, av diverse tekniska skäl som vi inte behöver gå in på.

AsaMedlem sedan dec. 20011 860 inlägg
#3

Tackar för tipsen :) Skall se om jag fåt till detta. Men 5 och 6 vet jag ej om jag kikar på. Iallafall inte 6 för det vet jag inte riktigt hur man ska göra.

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