28. maj 2007 - 16:12Der er
24 kommentarer og 1 løsning
Hente top x
Hej,
jeg er kommet ind i følgende problem, jeg skal hente top x og bruger følgende fremgangsmåde:
SELECT TOP 16 EkspeditionsNr, DatoAnden, VareNr, AfhentPladsNr, LevPladsNr FROM vejning WHERE (DatoAnden >= '2007-05-19 00:00:00') AND (DatoAnden <= '2007-05-25 23:59:59') AND (EkspeditionsNr > 0) ORDER BY ekspeditionsnr
dette går også helt fint indtil jeg kommer over en vis datamængde (tidsinterval). Som jeg kan tolke det, så er det der tager tid "ORDER BY", for hvis denne udelades, kommer der svar med det samme. Hvordan kan jeg optimere denne select?
Jeg mener den del, som udskriver eller bearbejder de hentede poster fra databasen. :) Har du i øvrigt mange poster i denne? Det kunne lyde som om, du har enormt mange.
Det bliver lagt direkte over i et datagridview (C#), men lige nu tester jeg det direkte i MS SQL Server Management Studio. Og ja, lidt data er der da i tabellen, lige pt en lille million poster.
Du behøver ikke at komme med indexhints i din query.
SQL server finder selv ud af den igennem sin execution plan, og med mindre du er en haj til index, så er chancerne for at SQL server finder det bedste index større end for at man selv gør det :=)
en anden ting der kan mikro optimere er at bruge between keyword.
SELECT TOP 16 EkspeditionsNr, DatoAnden, VareNr, AfhentPladsNr, LevPladsNr FROM vejning WHERE DatoAnden between '2007-05-19 00:00:00' AND '2007-05-25 23:59:59' AND (EkspeditionsNr > 0) ORDER BY ekspeditionsnr
Men jeg holder stadig på at det er indexet der er problemet.
Hmm alt med måde... der er vel ikke mere jeg med fordel kan lave index på? For øger jeg nu datointervallet endnu mere, halter den stadig rigtigt meget...
Ja og nej. Kommer an på hvad du mener med at holde index opdateret.
Alle nye og gamle poster i tabellen bliver indexeret automatisk.
MEN, index kan også blive fragmenteret, og alt efter hvor mange inserts / deletes du har i databasen kan det være en god ide at oprette en maintenance plan der vedligeholder index.
ja, det bedste index til din query vil sandsynligvis være på datoanden, ekspeditionsnummer i den rækkefølge.
Det skal selvføgeligt tages med det forbehold at jeg ikke ved hvilke andres queries du kører på databasen.
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.