Sql 优化聚合查询

Sql 优化聚合查询,sql,optimization,aggregation,Sql,Optimization,Aggregation,我正在寻找一种优化以下方面的方法: 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

我正在寻找一种优化以下方面的方法:

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是该表上的一个索引字段。问题:每个子查询都在同一组条目上重新运行-三次重新运行的次数太多。

您可以这样做:

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
您可以这样做:

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

你不能这样做吗

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

然后以编程方式处理其余部分?

您不能这样做吗

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

然后以编程方式处理其余部分?

很好,您还可以在(3、20、11、5)中使用txnType限制初始选择,同时使用[gid]和[txnType]字段的索引,甚至可能使用[amount]来避免查询甚至查看表本身。[gid]、[txnType]、[amount]上的覆盖索引带来的最大好处非常好,您还可以在(3、20、11、5)中限制使用txnType的初始选择,同时使用[gid]和[txnType]字段的索引,甚至可能使用[amount]来避免查询甚至查看表本身。[gid]、[txnType]、[amount]上的覆盖指数带来的最大好处