2013-09-23 2 views
0

다음과 같은 쿼리를 수행하는 데 소요되는 시간은 약 23 - 30 초입니다. 샘플 표는 2.8 백만 행을 가지며 테스트 표는 21.1 백만 행을 갖습니다. 기본 키 샘플 번호 및 테스트 번호에 인덱스가 있지만 count (distinct) 절이 성능에 심각한 영향을 미치고 있습니다. 성능 향상을 위해 COUNT DISTINCT에 함수 기반 색인을 사용할 수 있습니까?COUNT DISTINCT에 함수 기반 색인을 사용 하시겠습니까?

select 
    l.NAME as LABORATORY, 
    count(distinct s.SAMPLE_NUMBER), 
    count(distinct (case when l.NAME ='LPS' and t.BATCH is null then s.SAMPLE_NUMBER 
    else null end)) LPS 
    from LABORATORY l inner join SAMPLE s on l.NAME = s.LAB 
    inner join TEST t on s.SAMPLE_NUMBER = t.SAMPLE_NUMBER 
    and s.STATUS <> 'U' and s.TEMPLATE <> 'QC_SAMPLE' and t.STATUS in ('I', 'P') 
    group by l.NAME; 
+1

데이터 불충분 : 행 수, 각 테이블의 조건을 만족 가입
COUNT의 발현은 세 개의 테이블을 참조? 다른 인덱스가 있습니까? 각 테이블의 행 평균 크기? 또한 실제 ** 옵티 마이저 플랜 **을 보유하는 데 도움이됩니다! * 일반적으로 간단한 '사례'와 같은 단순한 계산은 실제로 행을 찾는 것 (큰 FULLSCAN + 해시 조인처럼 보임)보다 리소스와 시간이 덜 걸린다. –

답변

1

답은 NO, 당신은이 경우에 함수 기반 인덱스를 사용할 수 없습니다.

인덱스 (모든 인덱스)는 ONE 테이블에서 오는 열에 만 만들 수 있습니다. L + t + S

count(distinct (case when l.NAME ='LPS' and t.BATCH is null then s.SAMPLE_NUMBER 
    else null end)) LPS 
관련 문제