05. januar 2004 - 12:39Der 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 ?!?
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.
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
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.
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;
... 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
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.