저는 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 초이면 현재 실행 시간. 해당 담당자의 개선 사항
미리 감사드립니다.
omg ... 그것의 전체 4.5 초 빠릅니다 ... 나는 그것이 내가 당신이 선생님 이신 당신이 각하의 기간 (즉, 항상 30 일)을 owuld로 간주 할 때 실제로 그것을 할인했습니다. –
다행입니다. 추측 하건대, 나는 CASE의 경우 모든 행을 방문하고 최적화 할 수없는 방식으로 표현식을 평가해야한다고 생각합니다. COUNT (*)/WHERE는 인덱스를 더 잘 활용할 수있는 기회를 가지고 있습니다. –