18. juli 2007 - 13:36Der er
8 kommentarer og 1 løsning
Optimering af SQL sætning.
Hejsa.
Denne SQL er ikke helt lige til, og den bruges sammen med nogle AS400 tabeller, hvorfor kollonenavne er lidt ulogiske.
Og uden at i kender tabel strukturer osv, ved jeg ikke om i kan hjælpe. Men håber. Denne sql sætning tager ca. 29 sek om at blive kørt. Det kunne jeg godt tænke mig at optimere, hvis det kunne lade sig gøre.
Nogen der umiddelbart kan se nogle stedet i sætningen hvor den kunne optimeres lidt?
-----------
SELECT DISTINCT dbo.KVAMSTP.KVAFRO as FROSTPRIS, dbo.KVAMSTP.KVAUSR as BRUGER, dbo.KVAMSTP.KVAOAR AS AAR, dbo.KVAMSTP.KVAOMD AS MDR, dbo.KVAMSTP.KVAODG AS DAG, dbo.VARMSTL1.VARNR AS Varnr, dbo.VARMSTL1.VARTXT AS EmballageNavn, dbo.KVAMSTP.KUNNR AS Kundenr, dbo.KVAMSTP.KVAFSK AS pris FROM dbo.KVAMSTP INNER JOIN dbo.VARMSTL1 ON dbo.KVAMSTP.OFLVAR = dbo.VARMSTL1.VARNR WHERE (dbo.KVAMSTP.KVAOAR > 5) AND (dbo.KVAMSTP.KUNNR = '000199') OR (dbo.KVAMSTP.KVAOAR > 5) AND (dbo.KVAMSTP.KUNNR = '000399') OR (dbo.KVAMSTP.KVAOAR > 5) AND (dbo.KVAMSTP.KUNNR = '000499') OR (dbo.KVAMSTP.KVAOAR > 5) AND (dbo.KVAMSTP.KUNNR = '000599') OR (dbo.KVAMSTP.KVAOAR > 5) AND (dbo.KVAMSTP.KUNNR = '000899') OR (dbo.KVAMSTP.KVAOAR > 5) AND (dbo.KVAMSTP.KUNNR = '000799') OR (dbo.KVAMSTP.KVAOAR > 5) AND (dbo.KVAMSTP.KUNNR = '000699') ORDER BY dbo.VARMSTL1.VARNR, AAR, MDR, DAG
SELECT DISTINCT dbo.KVAMSTP.KVAFRO as FROSTPRIS, dbo.KVAMSTP.KVAUSR as BRUGER, dbo.KVAMSTP.KVAOAR AS AAR, dbo.KVAMSTP.KVAOMD AS MDR, dbo.KVAMSTP.KVAODG AS DAG, dbo.VARMSTL1.VARNR AS Varnr, dbo.VARMSTL1.VARTXT AS EmballageNavn, dbo.KVAMSTP.KUNNR AS Kundenr, dbo.KVAMSTP.KVAFSK AS pris FROM dbo.KVAMSTP INNER JOIN dbo.VARMSTL1 ON dbo.KVAMSTP.OFLVAR = dbo.VARMSTL1.VARNR WHERE ((dbo.KVAMSTP.KVAOAR > 5) AND (dbo.KVAMSTP.KUNNR = '000199')) OR ((dbo.KVAMSTP.KVAOAR > 5) AND (dbo.KVAMSTP.KUNNR = '000399')) OR ((dbo.KVAMSTP.KVAOAR > 5) AND (dbo.KVAMSTP.KUNNR = '000499')) OR ((dbo.KVAMSTP.KVAOAR > 5) AND (dbo.KVAMSTP.KUNNR = '000599')) OR ((dbo.KVAMSTP.KVAOAR > 5) AND (dbo.KVAMSTP.KUNNR = '000899')) OR ((dbo.KVAMSTP.KVAOAR > 5) AND (dbo.KVAMSTP.KUNNR = '000799')) OR ((dbo.KVAMSTP.KVAOAR > 5) AND (dbo.KVAMSTP.KUNNR = '000699')) ORDER BY dbo.VARMSTL1.VARNR, AAR, MDR, DAG
Jeg har forsøgt med at at lave index, og det fik den også ned fra 45 sek til 29.
Kan ikke lige se hvor det er du har lavet noget om i forhold til min sætning. Prøvede dit svar (selvom jeg ikke lige kan se nogen forskel i forhold til min egen). Samme resultat. Det tager mellem 29 - 34 sek at eksekvere sætningen!
WHERE dbo.KVAMSTP.KVAOAR > 5 AND ( dbo.KVAMSTP.KUNNR = '000199' OR dbo.KVAMSTP.KUNNR = '000399' OR dbo.KVAMSTP.KUNNR = '000499' OR dbo.KVAMSTP.KUNNR = '000599' OR dbo.KVAMSTP.KUNNR = '000899' OR dbo.KVAMSTP.KUNNR = '000799' OR dbo.KVAMSTP.KUNNR = '000699')
eller
WHERE dbo.KVAMSTP.KVAOAR > 5 AND dbo.KVAMSTP.KUNNR IN ('000199', '000399', '000499', '000599', '000899', '000799', '000699')
Ja ok. : WHERE dbo.KVAMSTP.KVAOAR > 5 AND dbo.KVAMSTP.KUNNR IN ('000199', '000399', '000499', '000599', '000899', '000799', '000699')
Virker lige så godt. Og det er selvfølgelig en kosmetisk forbedring. Men var mere eksekveringstiden jeg ville ha' sat ned! Men det kan da godt være at det bare ikke kan lade sig gøre!
Du skal også lige regne med, at forespørgselstiden er afhængig af behandlingstiden på AS400 og transporten mellem AS400 og den maskine, du foretager forespørgslen på.
Ikke helt, fordi det rent faktisk ikke er en forespørgelse direkte på AS/400. Jeg har et mellemled mellem AS400 og mit program. Så jeg laver et udtræk hver nat fra AS400 og gemmer i en SQL DB.
Never mind. Jeg fandt ud af at trimme mit udtræk hver nat, så dette blev betydeligt mindre, det hjalp og satte tiden på min overstående forespørgelse ned på 3 sek.
Men tak for indsatsen!
/Lasse
Synes godt om
Ny brugerNybegynder
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.