2010-02-11 3 views
1

저는 4 년과 1.7m 행의 데이터를 처리하는 데 어려움을 겪고있는 일부 오래된 SQL을 리팩토링하고 있습니다. 다음 MS SQL 쿼리를 개선 할 수있는 방법이 있나요 :SQL 개수 성능 향상을 찾습니다.

SELECT  ServiceGetDayRange_1.[Display Start Date], 
SUM (CASE WHEN Calls.line_date BETWEEN [Start Date] AND [End Date] THEN 1 ELSE 0 END) AS PerDayCount 
FROM   dbo.ServiceGetDayRange(GETUTCDATE(), 30, @standardBias, @daylightBias, @DST_startMonth, @DST_endMonth, @DST_startWeek, @DST_endWeek, @DST_startHour, @DST_endHour, @DST_startDayNumber, @DST_endDayNumber) AS ServiceGetDayRange_1 CROSS JOIN 
         (select [line_date] from dbo.l_log where dbo.l_log.line_date > dateadd(day,-31,GETUTCDATE())) as Calls 
GROUP BY ServiceGetDayRange_1.[Display Start Date], ServiceGetDayRange_1.[Display End Date] 
ORDER BY [Display Start Date] 

이 차트 .. 쓸모없는 정보를 플로팅 (ServiceGetDayRange 기능, TZ 정렬 범위를 자세히 테이블을 반환), 그러나 이전 30 일 동안의 로그 항목을 계산 나는 클라이언트가 아니다.

실행 계획의 상태는 예상대로 실행 시간의 99 %가 항목 계산에 사용됩니다. TZ 오프셋을 계산할 때 오버 헤드가 거의 없습니다 (최대 30 행 기억).

어리석은 나는 '아, 색인보기'라고 생각했지만 그때 나는 함수에 바인딩 할 수 없다는 것을 깨달았다.

6.25 초이면 현재 실행 시간. 해당 담당자의 개선 사항

미리 감사드립니다.

답변

3

사례를 어디로 변환하면 더 빠릅니까? 거의 2m 행에 대한

SELECT  ServiceGetDayRange_1.[Display Start Date], COUNT(*) AS PerDayCount 
FROM  dbo.ServiceGetDayRange(GETUTCDATE(), 30, @standardBias, @daylightBias, @DST_startMonth, @DST_endMonth, @DST_startWeek, @DST_endWeek, @DST_startHour, @DST_endHour, @DST_startDayNumber, @DST_endDayNumber) AS ServiceGetDayRange_1 CROSS JOIN 
         (select [line_date] from dbo.l_log where dbo.l_log.line_date > dateadd(day,-31,GETUTCDATE())) as Calls 
WHERE Calls.line_date BETWEEN [Start Date] AND [End Date] 
GROUP BY ServiceGetDayRange_1.[Display Start Date], ServiceGetDayRange_1.[Display End Date] 
ORDER BY [Display Start Date] 
+0

omg ... 그것의 전체 4.5 초 빠릅니다 ... 나는 그것이 내가 당신이 선생님 이신 당신이 각하의 기간 (즉, 항상 30 일)을 owuld로 간주 할 때 실제로 그것을 할인했습니다. –

+1

다행입니다. 추측 하건대, 나는 CASE의 경우 모든 행을 방문하고 최적화 할 수없는 방식으로 표현식을 평가해야한다고 생각합니다. COUNT (*)/WHERE는 인덱스를 더 잘 활용할 수있는 기회를 가지고 있습니다. –

0

6.25 초 아주 좋은 것입니다 .. 아마 유효한 행의 수를 시도합니다 (1/0 것을 허용해야 조건부) 값의 합에 반대 .. 그게 더 효율적이라고 생각 오라클 환경.

+0

실제로 실제로 6.25 초가 모든 상황에 대해 악의적 인 것이 아니라는 생각이 들었습니다. 지금은 사례 테스트 기반 카운트가 항상 좋지는 않다는 것을 알고 있습니다. –

관련 문제