我有一个包含两列的表:名称和金钱,“金钱”具有正值和负值。 我编写了一个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 ;
答案 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
,因此需要读取的内容更少
要真正说出正在发生的事情,您可能需要检查有索引和无索引的查询计划,看看是否有帮助