sql - 使用 SUM 进行 SQL 查询优化(case when)
问题描述
我有一个有两列的表:姓名和钱,“钱”有正值和负值。我编写了一个 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 ;
解决方案
大多数数据库引擎会为此查询使用覆盖索引。那将是(name, money)
.
结果查询计划本质上是对索引的扫描。这处理了group by
因为所有具有相同的行name
都是相邻的。该money
列已经在索引中,因此不需要在数据页上查找。
也就是说,并非所有数据库都实现了这种优化。即使那些不使用的可能仍然使用覆盖索引,这将减少查询的 I/O。
推荐阅读
- python - 如何在 Python 中计算傅里叶变换的 95% 置信度?
- linux - 如何在 Ubuntu 上安装 libdoc2testbench
- python - 如何使用轮廓命令在 python 中绘制一个圆圈,以便我可以将 clabel 放在线上?
- javascript - 如何在谷歌表格中运行两个单独的函数
- inno-setup - 更改 Inno Setup TDownloadWizardPage 的下载位置
- python - Plotly Choropleth 地图未显示
- c++ - 为什么不是 std::declval
() 当 std::declval 时为左值 () 是? - r - 仅当 R 中存在异常值时,如何使用通用方法删除异常值
- python - 如何在 Python 中编码这个条件?我是 python 新手
- excel - Excel vba - 如何在范围函数内使用变量?