Avatar billede blinklys79 Nybegynder
28. maj 2007 - 16:12 Der 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?

På forhånd tak!
Avatar billede w13 Novice
28. maj 2007 - 16:15 #1
Prøv at skrive resten af din kode her.
Avatar billede blinklys79 Nybegynder
28. maj 2007 - 16:20 #2
Hmm jeg er ikke helt med... det er hele min kode :-) Det er den select der volder problemer. Hvad er det mere du mangler?
Avatar billede w13 Novice
28. maj 2007 - 16:22 #3
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.
Avatar billede blinklys79 Nybegynder
28. maj 2007 - 16:25 #4
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.
Avatar billede 0xffff Nybegynder
28. maj 2007 - 16:25 #5
Det lyder som et index problem.

Du kan eventuelt lave et index på ekspeditionsnummer.
Avatar billede w13 Novice
28. maj 2007 - 16:25 #6
Hmm.. :) Og hvor lang tid går der med din "ORDER BY" sådan ca?
Avatar billede blinklys79 Nybegynder
28. maj 2007 - 16:29 #7
Vi snakker små 30 sek. ekstra når ORDER BY kommer på
Avatar billede w13 Novice
28. maj 2007 - 16:31 #8
Jeg skyder også på index ja. Men der er jeg ikke så stærk.
Avatar billede 0xffff Nybegynder
28. maj 2007 - 16:41 #9
Hvis du går ind i din enterprise manager, højreclicker på tabel vejning -> manage indexes -> New index -> Click ekspeditionsnr -> Vælg navn -> Ok.

Ellers kan du køre en query.

Create index [eksnr] on [dbo].[vejning][ekspeditionsnr]
Avatar billede blinklys79 Nybegynder
28. maj 2007 - 16:47 #10
Jeg har nu lavet et index, men det hjælper desværre ikke på udførelsestiden :-(
Avatar billede blinklys79 Nybegynder
28. maj 2007 - 16:48 #11
Har brugt: with (index(EkspeditionsNrIndex))
Avatar billede 0xffff Nybegynder
28. maj 2007 - 16:49 #12
hmm... gør mig lige en tjeneste og lav et på datoanden, ekspeditionsnr.

Den query skal ikke tage mere end højst et sekund.
Avatar billede 0xffff Nybegynder
28. maj 2007 - 16:50 #13
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 :=)

Så bare opret index og kør den første query,
Avatar billede blinklys79 Nybegynder
28. maj 2007 - 16:52 #14
Jeg tilføjede også bare indexhintet for at prøve det af, det gjorde nemlig desværre ingen forskel med eller uden index på udførelsestiden.
Avatar billede arne_v Ekspert
28. maj 2007 - 16:54 #15
Er der index på DatoAnden ?
Avatar billede blinklys79 Nybegynder
28. maj 2007 - 16:55 #16
Ja, det er der også
Avatar billede 0xffff Nybegynder
28. maj 2007 - 16:58 #17
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.
Avatar billede blinklys79 Nybegynder
28. maj 2007 - 16:58 #18
Hmm, men for god ordens skyld slettede jeg lige indexet på DatoAnden og lavede det igen... så flyver den bare derudaf :-)
Avatar billede blinklys79 Nybegynder
28. maj 2007 - 17:01 #19
Så arne_v og 0xffff, I må gerne ligge svar, så skal I få point for hjælpen :-)

Lige et tillægsspørgsmål, holder SQL serveren selv indexene opdateret?
Avatar billede blinklys79 Nybegynder
28. maj 2007 - 17:04 #20
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...
Avatar billede 0xffff Nybegynder
28. maj 2007 - 17:07 #21
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.
Avatar billede 0xffff Nybegynder
28. maj 2007 - 17:08 #22
det index du lavede var det på datoanden, ekspeditionsnummer ?
Avatar billede blinklys79 Nybegynder
28. maj 2007 - 17:09 #23
Der er intet i tabellen der bliver slettet, så fragmenteringen ser jeg intet problem i :)
Avatar billede blinklys79 Nybegynder
28. maj 2007 - 17:12 #24
Lige pt, har jeg lavet et index til ekspeditionsnr og et til datoanden, kan jeg med fordel lave en samlet.
Avatar billede 0xffff Nybegynder
28. maj 2007 - 17:14 #25
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.
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