2011-01-11 7 views
0

나는이 SP에 조정을 수행해야합니다이 저장 프로 시저에 어떤 문제가 있습니까?

alter PROCEDURE Gaming.usp_DB_GetGameResultsByDateTime 
(@FromDateTime AS DATETIME2(7) = null , 
@ToDateTime AS DATETIME2(7) = null) 
AS 
    DECLARE @FromDateTime_Actual AS DATETIME2(7) , 
      @ToDateTime_Actual AS DATETIME2(7); 
    SET @FromDateTime_Actual = ISNULL(@FromDateTime, DATEADD (DAY, -1, SYSDATETIME())); 
    SET @ToDateTime_Actual = ISNULL (@ToDateTime , SYSDATETIME()); 

    SELECT Id, GameTypeId, PlayerId, 
      BetAmount, Profit, 
      DateAndTime 
    FROM Gaming.GameResults 
    WHERE DateAndTime >= @FromDateTime_Actual 
    AND DateAndTime < @ToDateTime_Actual 
    ORDER BY DateAndTime ASC; 
GO 

이 저장 프로 시저에 문제가 있습니까? 이 저장 프로 시저를 어떻게 다시 작성 하시겠습니까?

+1

GameResults (DateAndTime)에 인덱스를 생성 해보다 효율적인? 그것은 충분히 간단 해 보인다. 성능면, DateAndTime 열에 인덱스가 있는지 확인하십시오 ... – JNK

+0

튜닝이 필요한 문제는 무엇입니까? –

+0

안녕하세요, 나는 dateandtime에 색인을 가지고있었습니다. 내가 어떻게 그것을 worte becryase 실행에 evby mayby ​​재 컴파일? 누군가 나처럼 생각하니? – dani

답변

0

제공 한 내용에 따라 proc은 매우 간단합니다. 성능 문제가있는 경우 모든 필터링이 해당 필드에 있으므로 인덱스는 DateAndTime이어야합니다. 당신은 빨리 당신이 아마 당신의 색인을보고 고려해야 성능을 찾고 있다면 내가

WHERE DateAndTime between @FromDateTime_Actual AND @ToDateTime_Actual 

을 할 수도 있지만 나는 그것이 성능

에 영향을 기대하지 않을 것이다 제외하고

0

나에게 물건을 본다 예를 들어 DateAndTime을 시작하는 것이 좋습니다. 당신이 Quassnoi가 언급 한 바와 같이 Perforamnce 팁 기사 like this one

보고해야합니다 그 후

, BETWEEN는 < = @FromDateTime_Actual에 < @FromDateTime_Actual을 변경하는 포괄적이다. 당신이 정말로 그것을 포괄적이 아니고 당신이 원한다면 BETWEEN 당신은 당신이 @ ToDateTime_Actual을 어떻게 설정 하는지를 수정할 수 있습니다.

+2

@ BOOTWEEN은 @ op의 쿼리가 포함되지 않는 동안 포함됩니다. – Quassnoi

+0

당신은 또한 'BETWEEN'을 사용하여 인덱스 혜택을 얻지 못합니다. – super9

+1

@Nai : 이것은 나에게 뉴스입니다. 근원을 인용하는 배려 –

2

이 저장 프로 시저에 아무런 문제가 없습니다.

당신은 변수 치우는하여 조금 더 읽기 쉽게 만들 수 있습니다 :

ALTER PROCEDURE 
     Gaming.usp_DB_GetGameResultsByDateTime 
     (
     @FromDateTime AS DATETIME2(7) = NULL , 
     @ToDateTime AS DATETIME2(7) = NULL 
     ) 
AS 
DECLARE 
     SELECT Id, GameTypeId, PlayerId, BetAmount, Profit, DateAndTime 
     FROM Gaming.GameResults 
     WHERE DateAndTime >= ISNULL (@FromDateTime , DATEADD (DAY , -1 , SYSDATETIME())) 
       AND DateAndTime < ISNULL (@ToDateTime , SYSDATETIME()) 
     ORDER BY 
       DateAndTime ASC 
GO 

하고 당신이 그것으로 발생하는 문제는 무엇

+0

괜찮지 만, 이렇게하면 차등 매개 변수로 실행되는 경우에도 쿼리의 재 컴파일 비용이 절약됩니까? 모든 실행에 대한 실행 계획을 저장하는 방법이 있습니까? – dani

+0

@dani : SQL 서버는 WITH RECOMPILE로 선언하지 않는 한 프로 시저에 대한 실행 계획을 캐시합니다. – Quassnoi

관련 문제