Avatar billede jobless Nybegynder
05. januar 2004 - 12:39 Der er 16 kommentarer og
1 løsning

Meget langsom select

Hej.

Jeg kører følgende foresp. i access2000:

SELECT * FROM ICD WHERE (((ICD.AutoInc) Not In (SELECT Firma FROM ICDAktiviteter WHERE ICDAktiviteter.Dato >= #10-1-2003# AND ICDAktiviteter.Dato <= #1-5-2004#)))
ORDER BY ICD.Firmanavn;

Formålet er at finde alle poster i ICD (firmaer), som ikke har nogen aktivitet(ICDAktiviteter) i den angivne periode.

Tabellen ICD indeholder godt 11.000 poster, og tabellen ICDAktiviteter indeholder ca. 31.000 poster.

I tabellen ICDAktiviteter har jeg index på dato.

Forespørgslen tager ca. 5 minutter at køre... kan dette ikke optimeres ?!?

MVH

JoBless
Avatar billede trer Nybegynder
05. januar 2004 - 13:38 #1
Du kan prøve at køre en compact & repair på din Access database - det kan hjælpe da db'en så defragmenteres.

Ellers prøv at skrive dit NOT IN (SELECT ..) om til et WHERE NOT EXISTS()

SELECT * FROM ICD WHERE  not exists (select 1 from ICDAktiviteter WHERE ICDAktiviteter.Dato >= #10-1-2003# AND ICDAktiviteter.Dato <= #1-5-2004# and
icd.autoinc = firma)
ORDER BY ICD.Firmanavn;

Dermed sparer du en sortering i din subselect- det burde også øge hastigheden.
Avatar billede uffe_kld Nybegynder
05. januar 2004 - 13:53 #2
WHERE ICDAktiviteter.Dato Between #10-1-2003# AND #1-5-2004#, burde forbedre performance
Avatar billede jobless Nybegynder
05. januar 2004 - 14:35 #3
Forslagene forbedrer performance, men jeg kommer ikke under ca. 4,5 minutter.

Er der noget totalt bagvendt ved min sql, skal den skrives helt om for at være optimal?
Avatar billede trer Nybegynder
05. januar 2004 - 14:44 #4
Hvis du ikke har det, så prøv at sætte indeks på dato kolonnen og firmanavn - det burde hjælpe.

Du gør det ved at åbne tabellen i design mode og markere kolonnerne som indekserede (og tillad dubletter)
Avatar billede trer Nybegynder
05. januar 2004 - 14:46 #5
Hmm - helt præcist sæt indeks på:
idc.autoinc (hvis det ikke er en primærnøgle)
idc.firmanavn
ICDAktiviteter.dato
ICDAktiviteter.firma
Avatar billede jobless Nybegynder
05. januar 2004 - 15:15 #6
Jeg har sat index på icd.firmanavn, resten havde jeg index på i forvejen.

Forespørgslen tager 4,33 minut...
Avatar billede trer Nybegynder
05. januar 2004 - 15:26 #7
Nu *er* det jo Access, så man kan ikke forvente det helt store, men alligevel...

Hvad har du kørende ellers på pc'en - har du fx et virusskjold som checker samtlige filer, laver heurestisk analyser eller tilsvarende?
Avatar billede trer Nybegynder
05. januar 2004 - 15:29 #8
Anden ting - hvor mange kolonner trækker du ud? Hvis du ikke skal bruge samtlige kolonner, så angiv en kolonneliste for dem du skal bruge.

Det kan også være, at du reelt set er vokset ud af Access og bør opgradere til en Access fronted med en MSDE backend. MSDE'en kan, hvis du ikke har den, downloades fra microsoft.com
Avatar billede jobless Nybegynder
05. januar 2004 - 15:32 #9
Jeg troer at du har ret i, at vi er ved at vokse ud af access.

Problemet ligger i, at alt er kodet på web-interface (asp), så der er en del som skal laves om, hvis vi skifter db-type
Avatar billede trer Nybegynder
05. januar 2004 - 15:42 #10
Faktisk ikke. Du burde kunne flytte alt direkte fra Access over i en MSDE - og så skal du blot rette din connection string til.  Der er en upgrade wizard i Access som håndterer det ret smertefrit.

En anden - knap så god - løsning er, at du flytter data over i MSDE (SQL Server) og så linker tabellerne.  Dermed er din Access db helt den samme, men data storage etc er nu i sql server.

Men... webløsning, så kommer der nok noget licens halløj med i det. SQL Server er ikke helt billig når vi taler om en internetløsning.
Avatar billede jobless Nybegynder
05. januar 2004 - 15:57 #11
Som jeg har undersøgt det, er der flere forskellige syntaxer mellem sql og access, og derfor skal der rettes mange steder i koden.

Løsning 2 er en mulighed, men det giver vel ikke optimal performance....

Ved ikke helt hvad jeg lige gør...
Avatar billede stoney96 Nybegynder
06. januar 2004 - 10:10 #12
Det bør være forbudt at bruge 'AND' i en sqlstreng da den trækker helt vildt ned i performance. Når 'AND' bruges kan index ikke bruges effektivt da alle poster smkal gennemlæses sekventielt.

Brug derfor altid nestede select-sætninger i stedet for 'AND'

I dit tilfælde noget a la:

SELECT * FROM ICD WHERE (((ICD.AutoInc) Not In (SELECT Firma FROM (Select firma from ICDAktiviteter WHERE ICDAktiviteter.Dato >= #10-1-2003#) where ICDAktiviteter.Dato <= #1-5-2004#)))
ORDER BY ICD.Firmanavn;
Avatar billede trer Nybegynder
06. januar 2004 - 10:28 #13
Det er så vidt jeg husker OR der giver det problem - ikke AND.
Avatar billede jobless Nybegynder
06. januar 2004 - 11:37 #14
stoney96: Dit foreslag tager 7,99 minut, og jeg har ikke checket om det giver de samme poster som ved de andre forslag...
Avatar billede stoney96 Nybegynder
07. januar 2004 - 13:22 #15
Æehhhh, så gir det vist ikke noget points, hva' ?
Avatar billede stoney96 Nybegynder
07. januar 2004 - 13:24 #16
... men i sql-server kan man sætte statistik på som viser en dramatisk reduktion i antal af disklæsninger når man benytter nestede SELECT's i stedet for AND
Avatar billede jobless Nybegynder
18. januar 2005 - 14:26 #17
lukketid...
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