2009-11-19 70 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) – 2009-11-19 11:10:03

+0

的初始选择。同时,对[gid]和[txnType]字段使用索引,甚至可以使用[amount ]以避免查询甚至查看表本身。来自[gid],[txnType],[金额]上的覆盖索引的最大收益, – MatBailie 2009-11-19 11:43:41

1

你能不能做这样的事

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

,然后编程方式处理它的休息吗?