Avatar billede wandaxp Praktikant
01. november 2007 - 22:23 Der er 11 kommentarer og
1 løsning

Optimering af SQL sætning/løkker som bliver for langsomme

Jeg har denne del kode som på siden køres 3 gange for at lave det i 3 niveauer, men den bliver vanvittig langsom når den startes, der er ca 3800 varer i tabellen men hvis jeg derimod med en anden søgning jeg har lavet søger efter tekster hvor den så søger i felterne med %like% så får den fundet alle resultater meget hurtigt, så er der en måde at optimer koden her på evt. genbruge den første DB opslag i næste løkke hvor kaldet er ens igen.

Jeg vil også gerne betale for en løsning hvis nogen kan hjælpe

På forhånd 1000 tak

koden:
' Tager alt fra tabellen "kategori_et"
set dbKategori_et = con.execute("select distinct kategori1 from varer where Kategori1<>NULL order by kategori1 asc")
' Tjekker om tabellen er tom
if not (dbKategori_et.bof or dbKategori_et.eof) then
    ' Hvis den ikke er tom, loop igennem alt den finder
    do until dbKategori_et.eof
        ' Laver en <div> rundt om kategori navnet, så den kan styres ved hjælp af CSS
        response.write "<div class='kategori_et'>"
        %>
        <!-- Laver links til at vise og skjule kategorien -->
        <table border="0" cellspacing="0" cellpadding="0" id="1.<%=dbKategori_et("kategori1")%>_show" class="show">
        <tr>
            <td width="15">
            <a
            onclick="show_element('1.<%=dbKategori_et("kategori1")%>');
            <% 'Looper gennem alle andre kategorier på niveau 1, og skjuler dem
            set dbKategori_et_cats = con.execute("select distinct kategori1 from varer where Kategori1<>NULL")
     
            if not (dbKategori_et_cats.bof or dbKategori_et_cats.eof) then
                do until dbKategori_et_cats.eof
                    if dbKategori_et_cats("kategori1") <> dbKategori_et("kategori1") then
                        response.write "hide_element('1." &dbKategori_et_cats("kategori1")& "');"
                    end if
             
                    set dbKategori_et_elements = con.execute("select * from varer where kategori1='" &dbKategori_et_cats("kategori1")& "'")
             
                    'Skjuler alle åbner kategorier på niveau 2
                    if not (dbKategori_et_elements.bof or dbKategori_et_elements.eof) then
                        do until dbKategori_et_elements.eof
                            response.write "hide_element('2." &dbKategori_et_elements("kategori2")& "');"
                     
                            dbKategori_et_elements.movenext
                        loop
                    end if
             
                    dbKategori_et_cats.movenext
                loop
            end if
            %>
Avatar billede neoman Novice
02. november 2007 - 01:48 #1
1. Virker Kategori1<>NULL ? Hvilken database kører du i? For sammenligning med NULL er i nogle db'er altid falsk, uanset værdi af kategori1

2. Du har loops i loops - ikke så underligt at det går skidt med 3800 records, for du  har så 3800*2 records du løber igennem som minimum blot for at få fat i dit kategorinavn =14 millioner

3. Så vidt jeg kan se har du denne ordning kun for at få fat i kategorinavne, for at kunne lave  din show/hide js-ting.  Lav en lidt smartere JS procedure - den skulle lukke alle de andre end den man klikker på. Hvis du havde  et array i JS med id på alle elementerne, så ville det ikke være nødvendigt  at liste alle dem som skal lukkes for hver eneste element, som du gør nu.

4. Din DB er ikke normaliseret - du burde have en tabel med KategoriID KategoriNavn, og i dine varer skulle du så have KategoriID, i stedet for navn. Navnelisten kunne du således hente een gang. Og tilsvarende for kategori2.

5. Hvis du ikke kan lave om på tabellerne, så skulle du nok i det mindste sætte index på kategori1

6. ("select * from varer where kategori1='" &dbKategori_et_cats("kategori1") skulle det ikke være ("select kategori2 from varer where kategori1='" &dbKategori_et_cats("kategori1")- i den viste kode bruger du ikke andet fra varer, så det er vel lidt spildt at hente mere end det du bruger.

Håber dette kan inspirere dig eller andre hjælpere. Jeg kigger ind igen fredag aften eller lørdag.
Avatar billede neoman Novice
02. november 2007 - 02:00 #2
ad 3. Hvis jeg har fattet din kode rigtigt, og målet er at åbne en kategori og lukke alle de andre, så er det ikke engang nødvendigt med at lave en liste. JS kunne løbe igennem alle elementer og finde dem som f.eks. har samme cssklasse eller del af id'et, og lukke alle dem på nær det element man selv har klikket på. Det kan du sikkert få hjælp til i javascript kategorien.
Avatar billede neoman Novice
02. november 2007 - 02:07 #3
og ad 1. Kategori1<>Null er altid SAND skulle der ha stået. Det er Kategori1=NULL som er falsk:) Din DB har sikkert en funktion som IsNull(variablen_som_skal_checkes) eller lign.
Avatar billede nielle Nybegynder
02. november 2007 - 06:53 #4
Den korrekte måde at skrive

... Kategori1<>Null

er:

... Kategori1 IS NOT Null
Avatar billede wandaxp Praktikant
02. november 2007 - 10:26 #5
Det kører p.t. i en access database
Avatar billede wandaxp Praktikant
02. november 2007 - 10:58 #6
Jeg har feltet Varenr i tabellen den er unik og nøglefelt.
Ellers har jeg
Kategori1 = Hovedmenupunktet som varen hører til i.
Kategori2 = Undermenu som varen hører til i.
Kategori3 = Sidste undermenu som varen hører til i.

Jeg tror faktisk du har ret i det med løkkerne der giver flere milioner poster, for elllers kører den jo ok i alt andet.
Javascripten kører også efter element_id så den kun er åben for den som er aktuel bortset fra hoveddelen.

Men asp koden herover kører jo med løkke efetr 2 * databaseudtræk og  igen med 2 * løkker for at finde kategori2 og igen 2 løkker for at finde kategori3, så det er helt klart nok der der skal gøres noget, men jeg kan simpelthen ikke gennemskue hvad jeg der kan gøre?

Jeg mailer også gerne kode filen eller poster den her og hvis jeg kan få et tilbud på hjælpen til optimeringen af menuen vil jeg gerne give noget for det, da jeg ikke selv er sikker nok på hvad jeg kan gører her?
Avatar billede neoman Novice
03. november 2007 - 10:15 #7
Du har ikke kommenteret løsningsforslagene.

Hvis det er fordi de fremstår som sort snak, så er det nok bedst at få nogen til at fikse hele din kode for dig, og jeg foreslår, at du lægger opgaven i udbud her: http://www.eksperten.dk/spm/Opgaver/Programmeringsopgaver/ASP/
Avatar billede neoman Novice
04. november 2007 - 00:03 #8
Nu har jeg set dit andet indlæg, og dertil har jeg en kommentar: hvis du ikke fatter en bønne af hvad det foregår i din kode, så er det fint nok.

Men, det er totalt spild af tid for dem som læser din besked at du beder om hjælp til at DU kan fikse koden, i stedet for direkte at sige "jeg aner ikke hvad der foregår - fiks det for mig".

Næste gang: hvis koden er mere end hvad du kan tackle - skriv det som det er, så får du ikke arrige idioter som mig på halsen.
Avatar billede wandaxp Praktikant
04. november 2007 - 00:44 #9
1. Har jeg rettet men gør ingen forskel.
2. Det er som jeg skrev den jeg godt kan se problemet i, men ikke ved hvordan jeg kan optimerer.
3. Denne mulighed skal jeg have prøvet af.
4. der har jeg nøglefeltet som beskrevet som i princippet gør det ud for en ID felt.
5. samme som ved 4, den er indexeret til ingen dubletter som beskrevet.
6. ja det var en fejl, og den har jeg rettet.

Jeg ber ikke om en direkte fiksning af det, men om hjælp til optimering af løkkerne så den ikke er så tung.
Dog er der en der gerne vil hjælpe mod betaling er jeg selvfølgelig også interesseret, men det er ikke fordi jeg ikke selv kender til programmeringen og ikke gerne selv vil løse problemet men jeg har desværre ikke helt overblikket over denne menu dannelse.
Jeg kan kun beklage hvis du er utilfreds, men det kan selvfølgelig ikke hjælpe dig, men håber du tager imod undskyldningen hvis du mener jeg har udtrykt mig forkert i dette spørgsmål?
Avatar billede wandaxp Praktikant
22. november 2007 - 23:23 #10
Slut
Avatar billede wandaxp Praktikant
22. november 2007 - 23:23 #11
Nille vil du give svar på dette indlæg, så er pointene dine...
Avatar billede nielle Nybegynder
25. november 2007 - 15:32 #12
Tror nu at jeg springer over på point på denne her, men ellers tak for tilbudet. :^)
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
Kategori
Kurser inden for grundlæggende programmering

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