Avatar billede avalon116 Nybegynder
14. november 2005 - 15:27 Der 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;


Nogen gode ideer?
Avatar billede darth-domino Nybegynder
14. november 2005 - 15:31 #1
Har du prøvet at komprimer/reperer databasen??
Avatar billede avalon116 Nybegynder
14. november 2005 - 15:53 #2
jep
Avatar billede terry Ekspert
14. november 2005 - 16:25 #3
There is a lot of calcaulations and use of functions (iif, nz, dlookup..) so things may got slow. How long are we talking about?
Avatar billede avalon116 Nybegynder
14. november 2005 - 16:35 #4
7 minutter
Avatar billede avalon116 Nybegynder
14. november 2005 - 16:35 #5
<ideen med beregningerne er at udjævne parameteren således at den udjævner med de værdier, der ligger før eg efter.
Avatar billede terry Ekspert
14. november 2005 - 16:56 #6
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.
Avatar billede 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....
Avatar billede avalon116 Nybegynder
15. november 2005 - 08:43 #8
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)?
Avatar billede avalon116 Nybegynder
15. november 2005 - 09:17 #9
Hmmm ser lige, at jeg tidligere har haft dette spm. på:
http://www.eksperten.dk/spm/325008

Jeg tror måske løsningen på det her spm. ligger i svaret der, selvom det ikke var det samme, jeg var ude efter dengang. Det prøver jeg lige.
Avatar billede avalon116 Nybegynder
15. november 2005 - 09:26 #10
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?
Avatar billede terry Ekspert
15. november 2005 - 12:14 #11
You can make a sub select instead of using Dlookup.

example:
SELECT T.ID  (Select ID From tblTst WHERE tblTst.ID = T.ID +1) AS NextID
FROM tblTst AS T;
Avatar billede jensen363 Forsker
15. november 2005 - 14:34 #12
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
Avatar billede mortendj Nybegynder
15. november 2005 - 17:32 #13
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.
Avatar billede avalon116 Nybegynder
16. november 2005 - 08:20 #14
oki tak for alle gode indspark. Jeg får nok kikket på det i morgen aften. Så vender jeg tilbage
Avatar billede avalon116 Nybegynder
19. november 2005 - 10:21 #15
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.

Hvis du har flere ideer, er de meget velkomne.
Avatar billede avalon116 Nybegynder
19. november 2005 - 10:22 #16
mortendj> så vidt jeg ved kan man ikke bruge DLookup i en funktion lavet i VB, er det ikke korrekt?
Avatar billede avalon116 Nybegynder
19. november 2005 - 11:25 #17
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)));
Avatar billede terry Ekspert
19. november 2005 - 12:09 #18
:o)
Avatar billede terry Ekspert
19. november 2005 - 12:10 #19
.
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
Dyk ned i databasernes verden på et af vores praksisnære Access-kurser

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