Avatar billede lasserasch Juniormester
18. juli 2007 - 13:36 Der 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

--------------

Mvh.
Lasse
Avatar billede bennytordrup Nybegynder
18. juli 2007 - 13:41 #1
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
Avatar billede bennytordrup Nybegynder
18. juli 2007 - 13:41 #2
giver den en forskel?
Avatar billede bennytordrup Nybegynder
18. juli 2007 - 13:43 #3
Din SQL ville formodentlig ikke give det tilsigtede resultat, da and og or evalueres forskelligt

Har du mulighed for at definere indeks?
Avatar billede lasserasch Juniormester
18. juli 2007 - 14:06 #4
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!

/Lasse
Avatar billede lasserasch Juniormester
18. juli 2007 - 14:07 #5
Det er selvfølgelig og 2 tabeller med omkring 50.000 records i hver, den skal løbe igennem, men alligevel synes jeg 30 sek er lang tid!

/Lasse
Avatar billede morhan Novice
18. juli 2007 - 14:36 #6
du må kunne forkorte WHERE-delen ned

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')
Avatar billede lasserasch Juniormester
18. juli 2007 - 15:19 #7
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!

/Lasse
Avatar billede bennytordrup Nybegynder
18. juli 2007 - 15:23 #8
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å.
Avatar billede lasserasch Juniormester
02. oktober 2007 - 11:40 #9
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
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
Computerworld tilbyder specialiserede kurser i database-management

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