2013-05-23 5 views
0

나는이 행이 :합계 필터링 된 값

value1 | value2 | value3 
------------------------- 
1231234|23423423|B 
2342345|12309123|X 
3242344|53453453|X 
3453454|45345344|I 
2531534|53434534|X 
6657555|42342234|I 
3242343|34534345|B 

내가 필터링 합 필터링 값 1없이 값 2를 필터링 할.

그런 경우를 수행하는 더 좋은 방법은 무엇입니까?

비용 300K 행 6 시간으로이 방법

SELECT 
    SUM(value1), 
    SUM(CASE WHEN (value3 = 'B' OR value3 = 'I') THEN value2 ELSE 0 END) FROM t 

현재 열의 합 쿼리.

예상 사전 결과 :

value1 | value2 | value3 
------------------------- 
1231234|23423423|B 
2342345|0  |X 
3242344|0  |X 
3453454|45345344|I 
2531534|0  |X 
6657555|42342234|I 
3242343|34534345|B 

답변

4

이 빠르게 where 절에있을 것입니다 :

select sum(value2) 
from t 
where value3 in ('B', 'I') 

이 빠르게 (value3, value2)에 인덱스 될 것입니다.

그러나이 쿼리는 300k 행의 경우 6 시간이 걸리지 않습니다. 테이블이 실제로보기 인 경우에만 발생합니다. 매우 매우 복잡한보기입니다.

+0

편집을 참조하십시오. 필터링 값없이 수행해야합니다. 1 –

+0

위의 대답에는 값 1의 필터링이 없습니다. –

0

당신의 접근 방식은 정확하지만, 간단한 쿼리는 300,000 개의 행에 대해 6 시간이 걸리지 않아야합니다. 나는 성능을 해치고있는 다른 일이 벌어지고 있다고 의심합니다.

SELECT 
    SUM(value1), 
    (SELECT SUM(value2) FROM t WHERE value3 IN ('B','I')) 
    FROM t 

그러나이 거의 B와 I 기록하고 당신이 value3에 인덱스를하지 않는 한 그것은 극적인 변화를 수행하지 않아야합니다

당신은 행함을 시도 할 수는 서브 쿼리이다.

또는 DBA 또는 SQL 개발자에게 문의하면 쿼리 계획을보고 성능 문제를 일으키는 다른 것이 있는지 확인하십시오.