Just nu i M3-nätverket
Jump to content

Dålig Prestanda på mitt forum


GAS

Recommended Posts

Jag har ett ganska så välbesökt forum på nätet problemet är att forumet kraschar ibland :(. Jag postade en smutt av koden här för ett tag sedan. Då fick jag till svar att den loopar tror jag det var. Är evigt tacksam om någon har ett förslag om hur jag lättar upp trycket på DB:n. Koden kan se ut som följande.

Dim Connect, RecSet, Antal

 

'''''''''' Detta är antalet inlägg som ska visas / sida ''''''''''''''

numberToShow=100

numberOfPages=10

''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

 

 

Set RecSet = Server.CreateObject("ADODB.RecordSet")

SQL = "SELECT Count(ID) From asp"

RecSet.Open SQL, Connect, 3, 3

Antal = recset(0)

RecSet.Close

 

response.write "Nu är det " & Antal & " inlägg i Forumet"

suma=Antal

 

%></font>

<br>

<font face="Verdana, Arial, Helvetica, sans-serif" size="2" color="#000000">

<a href="javascript: window.location.reload()"><b>Uppdatera denna sida</b></a><br>

 

</div>

<%

Session.LCID=1053

 

Set RecSet = Server.CreateObject("ADODB.Recordset")

 

 

'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

' Detta borde lätta upp trycket lite på db:n. Den plockar bara ut de 499 senaste inläggen. ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

' Söken kommer fortfarande att fungera på de gamla inläggen. ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

'Addera = "Select top 250 * From asp WHERE REF_ID = 0 ORDER BY DATUM DESC" ''''''''''''' plockar ut de 499 senaste ämnena. Kan du ändra om du vill ''''''''''

'Addera = Addera = "Select * From asp WHERE REF_ID = 0 ORDER BY DATUM DESC" ''''''''''''' Ta bort den övre och kommentera fram denna för att få det som förut'

'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

 

'Addera = "Select top " & CStr(NumberToShow * NumberOfPages) & " * >From asp WHERE REF_ID = 0 ORDER BY DATUM DESC"

 

'Sortera med inlägg som har fått svar senast överst! (fungerar inte än, men jag jobbar på det...)

'Addera="SELECT TOP 300 A1.ID, A1.NAMN, A1.RUBRIK, A1.DATUM, A1.ANTALSVAR, "

'Addera=Addera & "(CASE WHEN COUNT(A2.ID)=0 THEN 9999 ELSE DATEDIFF(mi, MAX(A2.DATUM), GetDate()) END) AS MINUTER "

'Addera=Addera & "FROM ASP AS A1 LEFT JOIN ASP AS A2 ON (A2.REF_ID=A1.ID) "

'Addera=Addera & "WHERE A1.REF_ID = 0 "

'Addera=Addera & "GROUP BY A1.ID, A1.NAMN, A1.RUBRIK, A1.DATUM, A1.ANTALSVAR "

'Addera=Addera & "ORDER BY (CASE WHEN COUNT(A2.ID)=0 THEN 9999 ELSE DATEDIFF(mi, MAX(A2.DATUM), GetDate()) END), A1.DATUM DESC"

 

'Sortera som vanligt!

Addera="SELECT TOP 500 A1.ID, A1.NAMN, A1.RUBRIK, A1.DATUM, A1.ANTALSVAR, DATEDIFF(mi, MAX(A2.DATUM), GetDate()) AS MINUTER "

Addera=Addera & "FROM ASP AS A1 LEFT JOIN ASP AS A2 ON (A2.REF_ID=A1.ID) "

Addera=Addera & "WHERE A1.REF_ID = 0 "

Addera=Addera & "GROUP BY A1.ID, A1.NAMN, A1.RUBRIK, A1.DATUM, A1.ANTALSVAR "

Addera=Addera & "ORDER BY A1.DATUM DESC"

 

RecSet.Open Addera, Connect, adOpenStatic, adLockOptimistic

X=0

Y=0

 

'''''''' Läser in datan som skickas i url:en. Ex forum?page=1 '''''''''''''''''''''''''''''''''''''''''''''

page=0

page=request.querystring("page")

Antal = RecSet.RecordCount '''' antalen huvudinlägg ....

 

do while not recSet.EOF

 

IntervallStart=page*numberToShow

Link to comment
Share on other sites

Det hade ju varit lättare att läsa om du tagit bort alla kommenterade rader innan du skickade inlägget.

 

SELECT TOP 500

Visar du verkligen 500 poster på sidan samtidigt? Det kanske tar lite tid?

 

FROM ASP AS A1 LEFT JOIN ASP AS A2 ON (A2.REF_ID=A1.ID)

Gör du en join på samma tabell? Varför?

 

do while not recSet.EOF

Testa att istället för att loopa igenom recorsetet istället skyffla över det till en array som du sedan loopar igenom. På så sätt kan du stänga databaskopplingen och recordsetet mycket tidigare.

 

EX:

arrInlagg = recSet.getrows()

if isArray(arrInlagg) then

for intC = 0 to UBOUND(isArray)

response.write arrInlagg(0,intC) & " " & arrInlagg(1,intC)

loop

else

response.write "Inga poster"

end if

 

Sen nämner du ju inte vilken databas du använder men i ett tidigare inlägg så är det en Accessdatabas. Där kan du ju tjäna in lite genom att byta till SQL-server eller MySQL.

 

/Niklas

 

Link to comment
Share on other sites

Det där med att skyffla över all data till en Array tror jag är överskattat. Finns dock säkert en hel del folk som säger emot.

 

Tror jag diskuterade det en massa i en tråd förut. Kommer inte ihåg vilken dock.

 

/JANspeed

 

Link to comment
Share on other sites

Det är möjligt att jag också var med i den tråden. Jag tror slutsatsen där var att man får testa och se om det gör någon skillnad. För mig var det en enorm prestandaökning iallafall, men för andra gjorde det mindre skillnad.

 

Så testa i din miljö och se om du tjänar något på det.

 

/Niklas

 

Link to comment
Share on other sites

Archived

This topic is now archived and is closed to further replies.



×
×
  • Create New...