Avatar billede nickbuus Nybegynder
30. november 2005 - 23:56 Der er 9 kommentarer

hvorfor dræner denne stored procedure min cpu totalt

hvorfor dræner denne stored procedure min cpu totalt? er det måden jeg joiner tabellerne på eller paging delen?


ALTER PROCEDURE dbo.sp_FeedGetUserTournaments
    (
        @feedID int = 0,
        @pokerRoomId int = 0,
        @gameTypeId int = 0,
        @limitTypeId int = 0,
        @minBuyIn int = -1,
        @maxBuyIn int = -1,
        @prizePool int = 0,
        @currentPage As int,
        @pageSize As int = 20,
        @totalRecords As int OUTPUT
    )

AS
-- Turn off count return.
Set NoCount On
DECLARE @SelectClause varchar(8000),
@FromClause varchar(8000),
@WhereClause varchar(8000),
@OrderBy varchar(8000),
@WhereFound int,
@firstRec int,
@lastRec int

SET @WhereFound = 0
-- Initialize variables.
Set @firstRec = (@currentPage - 1) * @pageSize
Set @lastRec = (@currentPage * @pageSize + 1)


-- Create a temp table to hold the current page of data
-- Add an ID column to count the records
Create Table #TempTable
(
tournamentID int identity PRIMARY KEY,
pokerRoom varchar(60),
gameType varchar(20),
limitType varchar(12),
minBuyIn decimal(9,2),
maxBuyIn numeric,
prizePool numeric,
description text,
playDate datetime,
roomId int,
roomLink varchar(200),
affID varchar(200),
userAffLink varchar(200)
)
--SET IDENTITY_INSERT #TempTable ON
--Begin building SELECT clause
SET @SelectClause = 'SELECT roomName AS pokerRoom, gameName AS gameType, limitName AS limitType, minBuyIn,
maxBuyIn, prizePool, description, playDate, PokerRoom.roomId, PokerRoom.roomLink, PokerRoom.affID, FeedPokerUserRoom.userAffLink ' 
SET @FromClause = 'FROM Poker
INNER JOIN PokerRoom ON (PokerRoom.roomID = Poker.pokerRoomId)
INNER JOIN PokerGameType ON (PokerGameType.gameTypeId  = Poker.gameTypeId)
INNER JOIN PokerLimitType ON (PokerLimitType.limitTypeId = Poker.limitTypeId)

LEFT JOIN FeedPokerUserRoom ON (FeedPokerUserRoom.roomID = PokerRoom.roomID)
AND FeedPokerUserRoom.feedID = ' + LTRIM(STR(@feedID))


IF @feedID <> 0
SET @FromClause = @FromClause + '
INNER JOIN FeedPokerRoom ON (FeedPokerRoom.roomID = Poker.PokerRoomId)
INNER JOIN FeedPokerGameType ON (FeedPokerGameType.gameTypeID = Poker.gameTypeID)
INNER JOIN FeedPokerLimitType ON (FeedPokerLimitType.limitTypeID = Poker.limitTypeID)'
--END building SELECT clause

--Begin building WHERE clause
IF @pokerRoomId <> 0 OR @gameTypeId <> 0 OR @limitTypeId <> 0 OR @minBuyIn <> -1 OR @maxBuyIn <> -1 OR @feedID <> 0 OR @prizePool <> 0
SET @WhereClause = CHAR(10) + 'WHERE '
ELSE
SET @WhereClause = ''

IF @pokerRoomId <> 0
BEGIN
IF @WhereFound = 1
BEGIN
SET @WhereClause = @WhereClause + ' AND '
END
SET @WhereClause = @WhereClause
+ 'Poker.pokerRoomId =' + LTRIM(STR(@pokerRoomId))
SET @WhereFound = 1
END

IF @gameTypeId <> 0
BEGIN
IF @WhereFound = 1
BEGIN
SET @WhereClause = @WhereClause + ' AND '
END
SET @WhereClause = @WhereClause
+ 'Poker.gameTypeId =' + LTRIM(STR(@gameTypeId))
SET @WhereFound = 1
END

IF @limitTypeId <> 0
BEGIN
IF @WhereFound = 1
BEGIN
SET @WhereClause = @WhereClause + ' AND '
END
SET @WhereClause = @WhereClause
+ 'Poker.limitTypeId =' + LTRIM(STR(@limitTypeId))
SET @WhereFound = 1
END

IF @minBuyIn <> -1
BEGIN
IF @WhereFound = 1
BEGIN
SET @WhereClause = @WhereClause + ' AND '
END
SET @WhereClause = @WhereClause
+ 'Poker.maxBuyIn >=' + LTRIM(STR(@minBuyIn))
SET @WhereFound = 1
END

IF @maxBuyIn <> -1
BEGIN
IF @WhereFound = 1
BEGIN
SET @WhereClause = @WhereClause + ' AND '
END
SET @WhereClause = @WhereClause
+ 'Poker.maxBuyIn <=' + LTRIM(STR(@maxBuyIn))
SET @WhereFound = 1
END

IF @feedID <> 0
BEGIN
IF @WhereFound = 1
BEGIN
SET @WhereClause = @WhereClause + ' AND '
END
SET @WhereClause = @WhereClause
+ 'FeedPokerRoom.feedID =' + LTRIM(STR(@feedID))
SET @WhereFound = 1
END

IF @feedID <> 0
BEGIN
IF @WhereFound = 1
BEGIN
SET @WhereClause = @WhereClause + ' AND '
END
SET @WhereClause = @WhereClause
+ 'FeedPokerGameType.feedID =' + LTRIM(STR(@feedID))
SET @WhereFound = 1
END

IF @feedID <> 0
BEGIN
IF @WhereFound = 1
BEGIN
SET @WhereClause = @WhereClause + ' AND '
END
SET @WhereClause = @WhereClause
+ 'FeedPokerLimitType.feedID =' + LTRIM(STR(@feedID))
SET @WhereFound = 1
END

IF @prizePool <> 0
BEGIN
IF @WhereFound = 1
BEGIN
SET @WhereClause = @WhereClause + ' AND '
END
SET @WhereClause = @WhereClause
+ 'prizePool >' + LTRIM(STR(@prizePool))
SET @WhereFound = 1
END

BEGIN
IF @WhereFound = 1
BEGIN
SET @WhereClause = @WhereClause + ' AND '
END
SET @WhereClause = @WhereClause
+ 'playDate >= DATEADD(HOUR,3,GETDATE()) '
SET @WhereFound = 1
END
--End building WHERE clause

--BEGIN building ORDER BY clause
SET @OrderBy = ' ORDER BY playDate '
--End building ORDER BY clause

declare @tempTableSql varchar(8000)
SET @tempTableSql = ' Insert Into #TempTable (pokerRoom, gameType, limitType,minBuyIn,
maxBuyIn,prizePool,description,playDate, roomId, roomLink, affID, userAffLink)
' + @SelectClause + @FromClause + @WhereClause + @Orderby
PRINT (@tempTableSql)
EXEC(@tempTableSql)

--Select one page of data based on the record numbers above
SELECT tournamentId, pokerRoom, gameType, limitType, minBuyIn, maxBuyIn, prizePool, description, playDate,roomId,  roomLink, affID, userAffLink
    FROM #TempTable AS Poker
    WHERE tournamentId > @FirstRec
    AND tournamentId < @LastRec

--Return the total number of records available as an output parameter
Select
@totalRecords = Count(*)
From
#TempTable


--PRINT (@SelectClause + @FromClause + @WhereClause + @OrderBy)
--EXEC(@SelectClause + @FromClause + @WhereClause + @OrderBy)   
    RETURN
Avatar billede dr_chaos Nybegynder
01. december 2005 - 08:25 #1
prøv at udkommenterer dele af den og se om dem bliver hurtigere.
Avatar billede arne_v Ekspert
02. december 2005 - 04:43 #2
temporær tabel + kompleks SQL + EXEC = ikke hurtigt

bedste bud er nok at check index'es
Avatar billede nickbuus Nybegynder
02. december 2005 - 07:43 #3
hvad vil det sige "check index'es"?
Avatar billede arne_v Ekspert
02. december 2005 - 14:05 #4
check om du har indexes på de felter du joiner på
Avatar billede nickbuus Nybegynder
04. december 2005 - 20:05 #5
er stadig lidt lost - kan du fortælle hvad et index er og hvor jeg finder den information - i query analyzer?
Avatar billede nickbuus Nybegynder
04. december 2005 - 20:06 #6
mener du om der er et foreign id som peger på hovedtabellen?
Avatar billede arne_v Ekspert
04. december 2005 - 20:29 #7
jeg mener at du ser det i table properties
Avatar billede ldanielsen Nybegynder
08. december 2005 - 13:57 #8
Du får lige foredraget om indexer:

Et index er en slags oversigt over hvor hvilke data findes i databasen, og hvis du beder MSSQL om det vil den oprette og vedligeholde det uden du behøver at gøre mere ved det.

Et eksempel er hvis du ofte vil have mange poster i en tabel sorteret alfabetisk efter et felt der fx. hedder strEfternavn. Data kommer ind i tilfældig orden i feltet, så når du beder om at få sorteret efter det får serveren travlt. Hvis du laver et index på feltet strEfternavn, så gemmer serveren en sorteret oversigt over data, og hver gang du tilføjer eller retter noget, bliver det vedligeholdt, og opslagene bliver meget hurtigere.

Den første type indexer som du sikkert allerede har brugt er Primærnøgler. ALLE tabeller skal have en primærnøgle! Disse er en speciel type indexer, som er dem serveren bruger til at finde en bestemt post. Beder du om at få fornavne på alle personer i en tabel med efternavnet 'Olsen', så laver serveren først en liste over de pågældende posters primærnøgler, og når de er lavet kan den lynhurtigt finde resten af dataene.

Den næste type som du åbenbart har brugt er Fremmednøgler. Det bruges til at fremskynde opslag, og til at sikre integriteten af data i to relaterede tabeller. Det vil sige når du laver et inner eller outer join, så er det jo vigtigt at de involverede felter er nogle som der meget hurtigt kan skabes overblik over.

Den tredje type er dem man laver for at optimere, udfra den type opslag der ofte laves. Sorteres der fx. ofte efter et datofelt, eller bedes der om poster hvor et datofelt er før ditten eller efter datten, så kan det være en god ide at indexere det datofelt.

Hvis der ikke findes et index på en kolonne, og du bruger den i en forespørgsel, så vil det ofte resultere i et "table scan", det vil sige at serveren læser og vurderer alle posterne i hele tabellen. Det koster kræfter.
Avatar billede dr_chaos Nybegynder
04. februar 2006 - 17:00 #9
Du mangler at lukke spørgsmålet.
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