Avatar billede zantiago Nybegynder
29. oktober 2008 - 19:59 Der er 14 kommentarer og
1 løsning

Performance optimering

Hej Eksperter,

Jeg har brug for lidt råd til at performanceoptimere en databasetung applikation som jeg har kodet.

Jeg har lavet en oversigt til et nyhedsbrevsmodul, som viser brugerne ned af og kategorierne ud af.

Se billede:
http://www.zantiago.dk/test/til_eksperten.jpg

Men når der er mange brugere og mange kategorier performer det meget skidt - og jeg tænker jeg har fundet synderen...

---------------------------------------------------------------
:: EXAMPLE CODE START ::
---------------------------------------------------------------

<%
'Undersøger om brugeren allerede er tilmeld gruppen
Set UserInGroupSQL = Server.CreateObject("ADODB.RecordSet")
UserInGroupSQL.Open "Select Count(Id) AS UserExists From [Newsletter_Users_In_Groups] WHERE Newsletter_User_Id = " & UserId & " AND Newsletter_Group_Id = " & NewsletterGroupID  , Conn         
%>
<td>
<input name="UserID-GroupID" value="<%=UserId%>-<%=NewsletterGroups("ID")%>" type="checkbox" <% If UserInGroupSQL("UserExists") = 1 Then Response.Write("Checked")%>  />
</td>
<%
UserInGroupSQL.Close
%>

---------------------------------------------------------------
:: EXAMPLE CODE END ::
---------------------------------------------------------------


Så jeg bruger altså lige nu Count(Id) for at finde ud af om posten eksisterer.

Er der en smartere måde, så jeg ikke skal kalde min sql ALT for mange gange??

på forhånd tak...

// Morten
Avatar billede arne_v Ekspert
29. oktober 2008 - 20:01 #1
Er der index paa Newsletter_User_Id og Newsletter_Group_Id ?
Avatar billede keysersoze Guru
29. oktober 2008 - 20:03 #2
hiv alle brugerens Newsletter_Group_Id ud og læg i et array vha GetRows() - http://activedeveloper.dk/articles/176/
Avatar billede zantiago Nybegynder
29. oktober 2008 - 20:05 #3
Arne_v : Tænkte på Index (du tænker at jeg skal cache dem på sql serveren ik?)
Men vil det ikke give problemer når man opdaterer data ofte?
Avatar billede zantiago Nybegynder
29. oktober 2008 - 20:05 #4
keysersoze - jeg lyder godt - jeg prøver lige :-)
Avatar billede arne_v Ekspert
29. oktober 2008 - 20:11 #5
Jeg taenker paa helt almindelige database index.

Og dem soerger databsen selv for at opdatere.
Avatar billede jokkejensen Novice
29. oktober 2008 - 20:20 #6
Er det access ?
Avatar billede zantiago Nybegynder
29. oktober 2008 - 20:27 #7
SQL 2000
Avatar billede zantiago Nybegynder
29. oktober 2008 - 21:11 #8
Keysersoze: Det har i hvert fald løst det ene performance problem med at den ikke skal kalde op 1 gang pr. bruger pr. kategori = ALT for mange :-)

Men nu kan der godt være eks. 250 brugere - og det giver jo stadig mange kald...

Kan jeg bruge samme måde, eller hvordan kommer jeg det til livs?

Har tænkt at sætte paging på, men vil stadig gerne have det så optimalt kodet som muligt ...
Avatar billede keysersoze Guru
29. oktober 2008 - 22:03 #9
du vil på samme måde sagtens kunne hive alle poster ud af databasen så både brugere og grupper kom ud i dit array - så vil du kun få ét kald men så et det større array.
Avatar billede zantiago Nybegynder
29. oktober 2008 - 22:15 #10
Jeg har bare svært ved at få dem smidt ind de rigtige steder - Hvis vi nu starter med grupperne kun. De bliver kald i databasen pr. person.
Har sat en Top 10 på min SQL, så altså 10 kald til databasen som henter personens registrerede grupper:

---------------------------------------------------------------
:: EXAMPLE CODE ::
---------------------------------------------------------------
<% ' DETTE ER KODEN SOM KØRER INDEN I LOOPET SOM HENTER PERSONERNE %>
<tr>
        <td>
        <a href="module_newsletter.asp?Action=recipient&User_Id=<%=UserId%>"><%=UserName%></a>
        <input name="Users" value="<%=UserId%>" type="hidden" />
        <%
        'Henter alle brugerens kategorier
        Set GroupsOnUser = Server.CreateObject("ADODB.RecordSet")
        GroupsOnUser.open "Select Newsletter_User_Id, Newsletter_Group_Id From [Newsletter_Users_In_Groups] WHERE Newsletter_User_Id = " & UserId & " AND Site_Id = " & Site_Id , Conn
       
        if not GroupsOnUser.eof then
            arrRecords = GroupsOnUser.getrows()
        end if
       
        for i=0 to ubound(arrRecords,2)
            response.write arrRecords(1,i) & vbcrlf & ""
        next
        %>
        </td>
        <%
        NewsletterGroups.MoveFirst
        Do while not NewsletterGroups.EOF
        NewsletterGroupID = NewsletterGroups("ID")
        %>
        <td>
        <input name="UserID-GroupID" value="<%=UserId%>-<%=NewsletterGroups("ID")%>" type="checkbox"  />
        </td>
        <%
        NewsletterGroups.MoveNext
        Loop
        %>
    </tr>
<% ' RESTEN AF KODEN SLUTTES HERUNDER %>
---------------------------------------------------------------
:: EXAMPLE CODE END ::
---------------------------------------------------------------

Mit problem er, at jeg på den enkelte checkbox skal lave et tjek om dens nummer, GroupID er på brugeren...

Der går jeg i stå? :-(
Avatar billede ikuyucu Nybegynder
11. november 2008 - 22:53 #11
Hvordan ser din database egentlig ud?
Avatar billede zantiago Nybegynder
13. november 2008 - 15:57 #12
keysersoze - Vil du ikke smide et svar?

Jeg brugte GetRows - og det kører super :-)
Avatar billede keysersoze Guru
13. november 2008 - 21:45 #13
selvfølgelig - svar :)
Avatar billede keysersoze Guru
29. december 2008 - 12:53 #14
lukketid?
Avatar billede zantiago Nybegynder
30. december 2008 - 09:26 #15
Nemli Ja
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

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