SQL按ID分组查询时无需将描述字段加入GROUP BY的最优方法
最优实现方案
先对Sale表完成分组聚合后,再关联Company表取公司名称,SQL写法如下:
SELECT agg.CompanyId, c.CompanyName, agg.Date, agg.TotalValue FROM ( SELECT CompanyId, Date, SUM(Value) AS TotalValue FROM Sale GROUP BY Date, CompanyId ) AS agg LEFT JOIN Company c ON agg.CompanyId = c.Id
方案优势说明
- 内层分组逻辑完全复用了你原有不加
CompanyName时的2秒快速查询逻辑,没有额外开销 - 分组后的结果集行数远小于原始
Sale表的行数,此时再和Company表关联,关联运算的量级极低,若Company表的Id是主键,关联查询效率更高 - 避免了两种原有写法的性能缺陷:
- 原第一种写法是先全量关联两张表再分组,关联后的临时表体积大,分组时需要多比对
CompanyName字段,额外产生了20秒的排序分组开销 - 你当前用的子查询写法需要为分组后的每一行单独执行一次
Company表查询,多次查询的开销累加导致耗时到5秒
这个方案的整体耗时仅比基础分组查询多一点,通常可以控制在3秒以内,比现有两种写法性能都好。
- 原第一种写法是先全量关联两张表再分组,关联后的临时表体积大,分组时需要多比对
内容的提问来源于stack exchange,提问作者Henrique Miranda
相关产品推荐
相关产品推荐

