문제

요컨대에는 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

서브 쿼리에 따라 없기 때문에 테이블 스캔이라고 생각합니다. 쿼리에서 설명을 실행하십시오.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top