01. november 2007 - 22:23Der 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")& "');"
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.
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.
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.
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?
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.
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?
Tror nu at jeg springer over på point på denne her, men ellers tak for tilbudet. :^)
Synes godt om
Ny brugerNybegynder
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.