14. november 2005 - 15:27Der er
18 kommentarer og 1 løsning
Langsom forespørgsel
Jeg har en forespørgsel, der kører for langsomt. Jeg har prøvet lidt af hvert bla. Trevor Best's modul tLookup i stedet for DLookup, men det hjælper ikke. I tabellen er der 9324 poster. Jeg har også prøvet at indeksere de felter der giver mening at indeksere. Min foresp. ser sådan her ud:
SELECT tParamFødte.Omr AS OMRAADENR, tParamFødte.Alder_0101 AS Alder, 0.05*nz(DLookUp("[P]","tParamFødte","[Id]=" & [Id]-2)) AS P1, 0.15*nz(DLookUp("[P]","tParamFødte","[Id]=" & [Id]-1)) AS P2, tParamFødte.P, 0.15*nz(DLookUp("[P]","tParamFødte","[Id]=" & [Id]+1)) AS P4, 0.05*nz(DLookUp("[P]","tParamFødte","[Id]=" & [Id]+2)) AS P5, IIf([Alder]=-1,0.8*nz([P])+[P4]+[P5],IIf([Alder]=0,0.65*nz([P])+[P2]+[P4]+[P5],IIf([Alder]=123,0.65*nz([P])+[P1]+[P2]+[P4],IIf([Alder]=124,0.8*nz([P])+[P1]+[P2],0.6*nz([P])+[P1]+[P2]+[P4]+[P5])))) AS PUdj INTO tInputFertilitet FROM tParamFødte ORDER BY tParamFødte.Omr, tParamFødte.Alder_0101;
7 minutes sounds like a long time but with lots going on it may not be easy to get it to run faster. I would try reducing the query to as little as possible gradually building at the same time checking the time taken to see if you can find what is taking the time. And I would look at Dlookup first not a good idea in a query if there are lots of records.
Synes godt om
Slettet bruger
15. november 2005 - 08:41#7
Lav dine dlookup om til selvstændige forespørgsler og byg din forespørgsel på disse!~)
Hvis det er muligt så gør det samme med IIf sætningerne....
Det har du nok ret i. Der er ikke andre måder end DLookUp når jeg vil have værdien af et felt i den forrige række (eller i den række der ligger to før den aktuelle)?
Denneher løser problemet delvist: SELECT tabel1.P AS P1, tabel2.P FROM tParamFødte AS tabel1, tParamFødte AS tabel2 WHERE (((tabel1.Id)=([tabel2].[Id]-2)));
Jeg får her det ene felt, der indeholder værdien af feltet "P" to rækker før den aktuelle række. Men hvis jeg skal sammenligne mere end et felt, dvs. jeg vil også gerne have værdien af feltet i rækken før, og værdien i rækken efter og værdien to rækker efter, hvordan skal det så se ud? Nogen bud?
Du er ude i et af det tilfælde, hvor det iflg. mine termer er tilrådeligt med præberegnede tabeller, hvori du gemmer mellemresultater. Jeg tror problemet ligger i alle dine kalkulationer, som princippielt gennemløber samtlige 9324 ... dvs. problemet bliver kun større med tiden
Du skal ikke bruge dlookup i en forespørgsel, når der skal laves så mange beregninger. Lave istedet en function under moduler som du benævner Test() hvor du laver de enkelte beregninger, for derefter at hente det ind i forespørgslen ved at skrive Test(). En anden måde er at vælge alle dine værdier ud i en forespørgsel, og derefter benytte den i næste forespørgsel.
Terry> din løsning er prøvet af. Hvis jeg har forstået rigtigt så ville det i mit ex. se sådan her ud:
SELECT tParamFødte.Id, tParamFødte.Omr, tParamFødte.Alder_0101, tParamFødte.P, (Select P From tParamFødte WHERE tParamFødte.Id = T.Id - 2) AS P1, (Select P From tParamFødte WHERE tParamFødte.Id = T.Id -1) AS P2, (Select P From tParamFødte WHERE tParamFødte.Id = T.Id + 1) AS P4, (Select P From tParamFødte WHERE tParamFødte.Id = T.Id + 2) AS P5 INTO tInputFertilitet FROM tParamFødte AS T INNER JOIN tParamFødte ON (T.Alder_0101 = tParamFødte.Alder_0101) AND (T.Omr = tParamFødte.Omr) ORDER BY tParamFødte.Id;
Her mangler så lige den sidste beregning. Men det virker og man kommer udenom DLookup. Til gengæld går det ikke spor hurtigere. Så der er jeg ligevidt.
Så nu har jeg fundet en løsning. Og den er nede på et par sek. nu. Terry vil du ikke smide et svar, det var mest dig, der fik mig på rette vej.
Min løsning er: SELECT tabel.Omr AS OMRAADENR, tabel.Alder_0101 AS Alder, 0.05*[tabel1].[P] AS P1, 0.15*[tabel2].[P] AS P2, tabel.P, 0.15*[tabel4].[P] AS P4, 0.05*[tabel5].[P] AS P5 INTO tInputFertilitet FROM tParamFødte AS tabel1, tParamFødte AS tabel, tParamFødte AS tabel2, tParamFødte AS tabel4, tParamFødte AS tabel5 WHERE (((tabel1.Id)=([tabel].[Id]-2)) AND ((tabel2.Id)=([tabel].[Id]-1)) AND ((tabel4.Id)=([tabel].[Id]+1)) AND ((tabel5.Id)=([tabel].[Id]+2)));
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.