Avatar billede lone_a_p Praktikant
30. april 2009 - 23:04 Der er 6 kommentarer og
1 løsning

Forespørgsel tager rigtig lang tid

Kære eksperter,

Jeg har en løkke der laver en sql-forespørgsel 15 gange - i alt tager scriptet rigtig lang tid (15 sek).

Når jeg kører de enkelte forespørgsler hver for sig, tager de ingen tid.

Har også afprøvet dem alle på én gang i phpmyadmin og det tager ingen tid.

Men i php-scriptet tager det 15 sekunder!


Jeg regner tiden ud således:

$time_start = get_microtime();

$sql = "min sql";

$result = mysql_query($sql, $db) or die (user_error("PROBLEMER MED DATABASEN: ".mysql_error()." SQL: ".$sql, E_USER_ERROR));
       
$time_end = get_microtime();

og tiden bliver således summeret op ($time_end - $time_start).

Kan databasen af en eller anden grund sætte en eller anden form for WAIT fra den ene sql til den næste?

Jeg forstår simpelthen ikke ovenstående. Andre tabeller har mange flere data og tager slet ikke så lang tid. Jeg har forsøgt at indexere på kolonnerne der står i where, men stadig uden held.

Nu går jeg til jer :)

Håber I vil hjælpe mig med at løse problemet.

Mvh Lone
Avatar billede arne_v Ekspert
30. april 2009 - 23:07 #1
Hvordan laver du loekken ?
Avatar billede lone_a_p Praktikant
30. april 2009 - 23:18 #2
løkken er en while ...

og den har en ende :) den læses de 15 gange.
Avatar billede CCodam Nybegynder
01. maj 2009 - 01:29 #3
Må man spørge hvorfor du køre en SQL forespørgsel 15 gange i træk? jeg er sikker på at der er en bedre løsning end dette...
Avatar billede acore Ekspert
01. maj 2009 - 20:56 #4
Er det muligt at poste lidt mere af koden, eller bliver det for uoverskueligt?

Hvis der sker andet end query-kaldet i løkken, så kan problemet teoretisk ligge der.
Avatar billede lone_a_p Praktikant
02. maj 2009 - 09:13 #5
Der er andet end query-kaldet i løkken, men ...

jeg laver det således:

time_ialt = 0
while (...){
    timestart
    intet andet end querykald her imellem timestart og -slut
    timeslut
   
    ... andet kode

    time_ialt += timeslut-timestart
}

skriv time_ialt (skriver 15 sek + sekunddele til resten af koden)

Så jeg er vel 100% sikker på, at det er query-kaldet, det er galt med?

Det er for uoverskueligt at poste hele koden - den sidder på 3 php-sider, men jeg mener også at kunne konkludere at ovenstående er der, hvor problemet er.

Jeg har forsøgt at lave en explain på sql-koden, og det mindste tal (som helst skal være 1) er godt nok også ret stort (oppe i 500 mener jeg, jeg sidder desværre ikke på min egen pc lige nu). Det er nemlig ikke nøglen, som jeg hverken spørger på eller kan spørge på. Det er endda kun 2 tabeller, som bliver brugt, men der er forespurgt på 3 kolonner i "where".

Jeg kan prøve at vise databaseopbygningen, når jeg kommer på min egen pc.

Vil det hjælpe, eller kan nogen se, hvad det er ud fra ovenstående skrift?

Jeg har på fornemmelsen, at koden på en eller anden måde bliver sat på "vent" af databasen. Kan dette forekomme? Ellers kan jeg da udelukke det :) Men synes jeg stødte på det, da jeg først søgte på nettet, inden jeg postede herinde - men måtte opgive :(

Mvh Lone
Avatar billede CCodam Nybegynder
02. maj 2009 - 15:22 #6
Vi skal som minimum bruge selve SQL queryen, derudover mangler jeg stadig forklaring på, hvorfor denne absolut skal være i en løkke?

Det er som regel muligt at hente alt data man skal brue ud i en SQL Query ind i et array, og herefter bruge det efterhånden...
Avatar billede lone_a_p Praktikant
25. juli 2009 - 19:09 #7
Er i gang med at lukke alle åbne spørgsmål.
Tak for alles deltagelse.
Mvh Lone
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
Computerworld tilbyder specialiserede kurser i database-management

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