2009-11-19 2 views
1

나는 다음과 같은 최적화하는 방법을 찾고 있어요 :최적화 집계 쿼리

@gid이 매개 변수와 GID이 테이블에 인덱스 필드
SELECT 
    (SELECT SUM(amount) FROM Txn_Log WHERE [email protected] AND txnType IN (3, 20)) AS pendingAmount, 
    (SELECT COUNT(1) FROM Txn_Log WHERE gid = @gid AND txnType = 11) AS pendingReturn, 
    (SELECT COUNT(1) FROM Txn_Log WHERE gid = @gid AND txnType = 5) AS pendingBlock 

. 문제 : 각 하위 쿼리는 동일한 항목 집합에서 다시 실행됩니다. 세 번의 재실행은 두 개 이상입니다.

답변

4

당신은 다음과 같이 수행 할 수 있습니다

select 
    sum(case when txnType in (3,20) then amount else 0 end) as pendingAmount, 
    sum(case txnType when 11 then 1 else 0 end) as pendingReturn, 
    sum(case txnType when 5 then 1 else 0 end) as pendingBlock 
from 
    Txn_Log 
where 
    gid = @gid 
+1

매우 좋으며, txnType IN (3, 20, 11, 5) –

+0

으로 초기 선택을 제한 할 수도 있습니다. 또한 [gid] 및 [txnType] 필드에 인덱스를 사용하고 [amount ]를 사용하여 쿼리 자체가 테이블 자체를 보지 않도록합니다. [gid], [txnType], [amount]에 대한 표지 색인에서 오는 가장 큰 이점은 – MatBailie

1

당신이

SELECT sum(amount),count(1), txnType 
FROM Txn_log 
WHERE gid = @gid AND 
    txnType in (3,5,11,20) 
group by txnType 

그런 짓을하고 프로그래밍 방식의 나머지 부분을 처리 할 수 ​​있습니까?