19. december 2004 - 19:19Der er
7 kommentarer og 1 løsning
Hjælp - stored procedure er langsom
Jeg har følgende stored procedure:
CREATE PROCEDURE [dbo].[GetBoard] ( @UserID int ) AS SELECT B.BoardID,B.UserID,B.FieldCount,F.Position,F.IsScratched,FT.*,P.PriceID from tblBoards as B join tblFields as F on B.BoardID=F.BoardID join tblFieldTypes as FT on F.FieldTypeID=FT.FieldTypeID left join tblPrices as P on P.BoardID=B.BoardID Where B.UserID=@UserID Order By Position;
GO
Mit problem er at den nu og da timer ud. Den kaldes fra en ASP .NET applikation med connection timeout sat til 30 sekunder. Tabellen tblFields indeholder omkring ~340.000 rækker men proceduren returnerer sjældent mere end omkring 25 rækker.
Timeouts'ne sker oftest på tidspunkter hvor .NET applikationen har mange brugere online, dvs. at queryet bliver kørt tit. Dog sjældent mere end 15 gange i minuttet.
Hvad kan jeg gøre for at forbedre performance ? Er der noget i min stored procedure, der er ineffektivt ? Burde SQL Server ikke kunne håndtere en tabel med 340.000 rækker ?
B.BoardID og FT.FieldTypeID er primære nøgler, så ja, de er med indeks. Resten er ikke.
Jeg har ikke meget erfaring eller indsigt i brug af indeks i forbindelse med SQL Server. Ville det være en fordel at bruge indeks på de kolonner, der joines mellem, i dette tilfælde ?
Jeg har nu tilføjet index. Det ser umiddelbart ud til at have hjulpet, men jeg holder lige øje med performance henover dagen i morgen, hvor jeg forventer at få mange brugere på applikationen.
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.