使用SUM的SQL查询优化(当情况下)

时间:2019-12-08 06:26:21

标签: sql

我有一个包含两列的表:名称和金钱,“金钱”具有正值和负值。 我编写了一个sql查询以获取提取和存入的总金额之和。我想知道是否有什么方法可以使此查询更高效,更快速地工作。

select name,
       SUM(case when money > 0 then money else 0 end) as deposit,
       ABS(SUM(case when money < 0 then money else 0 end)) as withdraw
from transfer
group by name
order by name ;

3 个答案:

答案 0 :(得分:1)

由于您的查询没有WHERE子句,因此必须读取 entire 表。这是您的主要性能问题。

然后必须将所有数据分组。那是您的次要性能问题。

除了可以通过name对表进行聚类之外,也无法进行任何改进,但是我不建议这样做。

答案 1 :(得分:1)

大多数数据库引擎都会对此查询使用覆盖索引。那将是(name, money)上的索引。

结果查询计划实质上是对索引的扫描。这处理group by,因为具有相同name的所有行都是相邻的。 money列已在索引中,因此无需在数据页上进行查找。

也就是说,并非所有数据库都实现此优化。即使那些不使用覆盖索引的索引,也可能减少查询的I / O。

答案 2 :(得分:0)

我实际上认为在name上添加索引可能会大大改善您的计划:https://www.brentozar.com/archive/2015/06/indexing-for-group-by/

正如其他答案和评论所建议的那样,可以预期您将在表中具有某种形式的标识,以便在该表上建立聚簇索引,但是对于您的特定查询,我想说您可以尝试对名称进行索引并包括money,因此需要读取的内容更少

要真正说出正在发生的事情,您可能需要检查有索引和无索引的查询计划,看看是否有帮助