문제
요컨대에는 2 개의 테이블이 있습니다.
사용자 :
------------------------
UserID | Name
------------------------
0 a
1 b
2 c
CALLS:
------------------------
ToUser | Result
------------------------
0 ANSWERED
1 ENGAGED
1 ANSWERED
0 ANSWERED
기타 등
각 고객에게 전화를 걸어 각각 2 백만 개가 넘는 기록이 있습니다. 현재 나는 이미 빠른 총 카운트를 수행 한 후 특정 결과의 각 재귀를 계산하기 위해 사례 명세서를 사용하고 있습니다.
COUNT(DISTINCT l_call_log.line_id),
COALESCE (SUM(CASE WHEN l_call_log.line_result = 1 THEN 1 ELSE NULL END), 0) AS [Answered],
COALESCE (SUM(CASE WHEN l_call_log.line_result = 2 THEN 1 ELSE NULL END), 0) AS [Engaged],
COALESCE (SUM(CASE WHEN l_call_log.line_result = 4 THEN 1 ELSE NULL END), 0) AS [Unanswered]
Inital Total Count 이후 3 개의 데이터 스캔을하고 있습니까? 그렇다면 한 번에 한 번의 스윕을 수행하고 한 번에 전화를 셀 수있는 방법이 있습니까?
감사.
해결책
이것은 전체 테이블 스캔이 필요합니다.
편집하다: 대답 할 정보가 충분하지 않습니다. 이전에 놓친 중복 제거 (별개)는 사용될 전략을 알 수 없습니다 .... 특히 데이터베이스 엔진을 모르면.
거의 모든 주요 쿼리 엔진에서 각 집계 기능은 각 행당 각 열 당 실행되며 캐시 된 결과 (예 : Count (*)와 같은)를 사용할 수 있습니다.
line_result가 색인화되어 있습니까? 그렇다면 쿼리의 다른 테이블에 따라 가치가 있는지 확실하지는 않지만 더 나은 쿼리 ( + count (*)를 활용하여 인덱스 통계를 활용할 수 있습니다.
다른 팁
거기에 있습니다 GROUP BY
SQL의 건축. 노력하다:
SELECT COUNT(DISTINCT l_call_log.line_id)
GROUP BY l_call_log.line_result
서브 쿼리에 따라 없기 때문에 테이블 스캔이라고 생각합니다. 쿼리에서 설명을 실행하십시오.
제휴하지 않습니다 StackOverflow