2009-11-19 3 views
1

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

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 

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

ответ

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] и, возможно, даже [количество ], чтобы избежать запроса, когда-либо даже рассматривающего таблицу. Большая польза от индекса покрытия по [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 

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

Смежные вопросы