21. februar 2005 - 08:12Der er
12 kommentarer og 1 løsning
Optimering af query
Jeg har en stump kode, som jeg skal have optimeret, men da jeg ikke selv er den helt store SQL-haj, så tænkte jeg, at der sikkert skulle være nogle herude som kunne hjælpe mig.
Selve query ser sådanne:
SELECT month(r4) as maaned, count(*) as antal, sum(r504) as ordresum, sum(r477a) as staalpris, sum(r477) as tonnage, avg(r509) as krkg, sum(r503) as fortjeneste, avg(r502) as db, 'test' as budget, 'test' as budgetafv FROM (SELECT ordre, MAX(rev) as rev FROM ordre GROUP BY ordre) as o, ordre, ordre0, ordre4, ordre5 LEFT JOIN kunde ON kunde_hidden = kunde.id WHERE o.ordre = ordre.ordre && o.rev = ordre.rev && ordre.id = ordre0.tilbudsnummer && ordre0.tilbudsnummer = ordre4.tilbudsnummer && ordre4.tilbudsnummer = ordre5.tilbudsnummer && r4 >= '$startdato' && r4 < '$slutdato' $where GROUP BY maaned ORDER BY maaned
og den tager alt for lang tid at eksekvere, hvordan kan den optimeres mest muligt?
Denne side indeholder artikler med forskellige perspektiver på Identity & Access Management i private og offentlige organisationer. Artiklerne behandler aktuelle IAM-emner og leveres af producenter, rådgivere og implementeringspartnere.
Jeg tror ikke at det er SELECT statementen der skal ændres. Det vigtigste må være at få sat index på de rigtige felter. Som hovedregel bør du have index på alle de felter som er på den ene eller anden side af et lighedstegn medmindre de er primær nøgler (primær nøgler har automatisk et index).
Så har jeg sat index på alle felter som ikke har det naturligt, men da jeg lige pt. arbejder på noget andet, kan jeg ikke lige nu tjekke om det virker hastighedsforberende.
Øh, når databasen indeholder data, kommer index så til at virke med det samme på alle felterne eller er det først fra de "nye" eller "opdaterede" data, som vil få glæde af indexet?
Øhhh, jeg er ked af at komme igen, men nu har det faktisk ikke hjulpet så meget. Arne tror du at query kan optimeres, eventuelt laves i små hug, selvom det godt nok i lige imod min indstilling?
Men jeg tror faktisk det er en anden query som er hård ved systemet:
SELECT count(*) as antal, sum(r504) as `sum` FROM (SELECT tilbud, MAX(rev) as rev FROM tilbud GROUP BY tilbud) as t, tilbud, tilbud0, tilbud5 LEFT JOIN kunde ON kunde_hidden = kunde.id WHERE t.tilbud = tilbud.tilbud && t.rev = tilbud.rev && tilbud.id = tilbud0.tilbudsnummer && tilbud0.tilbudsnummer = tilbud5.tilbudsnummer && r4 >= '$startdato' && r4 < '$slutdato' $where
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.