Оптимизировать запрос агрегации - PullRequest
1 голос
/ 19 ноября 2009

Я ищу способ оптимизировать следующее:

SELECT 
    (SELECT SUM(amount) FROM Txn_Log WHERE gid=@gid 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

где @gid - параметр, а gid - индексное поле в этой таблице. Проблема: каждый подзапрос повторяется с одним и тем же набором записей - три повторных запроса - это слишком много.

Ответы [ 2 ]

4 голосов
/ 19 ноября 2009

Вы можете сделать так:

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 голос
/ 19 ноября 2009

Разве вы не можете сделать что-то подобное

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

, а затем обработать все остальное программно?

...