【发布时间】:2021-10-11 13:30:37
【问题描述】:
我有两张桌子:
公司表
Id,
CompanyName
销售表:
Id,
CompanyId,
Date,
Value
我需要按日期和公司对销售额进行分组,并像这样显示:
CompanyId CompanyName Date Value
--------- -------------------- ---------- --------
1 Company 1 2021-10-01 2832.98
2 Company 2 2021-10-01 8112.81
1 Company 1 2021-10-02 2182.12
2 Company 2 2021-10-02 3521.11
我知道我可以通过这个轻松实现它
SELECT s.CompanyId, c.CompanyName, s.Date, SUM(s.Value) FROM Sale s
JOIN Company c on s.CompanyId = c.Id
GROUP BY s.Date, s.CompanyId, c.CompanyName
问题是当我在 GROUP BY 子句中包含 CompanyName 时,它会慢一个数量级。我也许可以通过添加一个新索引来规避它,但现在这不是一个选项。
我能够使用此查询使其运行得更快
SELECT
s.CompanyId,
(SELECT CompanyName FROM Company WHERE Id = s.CompanyId) as CompanyName
s.Date,
SUM(s.Value)
FROM Sale s
GROUP BY s.Date, s.CompanyId
但我想知道是否有更快/更好的方法。没有 CompanyName 的 group by 在 2 秒内运行,如果我将 CompanyName 添加到 GROUP BY 它会为查询增加 20 秒。使用我列出的最后一个查询,它会在大约 5 秒内运行。
【问题讨论】:
-
没有关于索引的信息和查询计划(您可以通过brentozar.com/pastetheplan 分享)我们无法帮助您。如果没有更好的索引,您不可能比现有的性能提高更多
-
您可以尝试将 行目标 添加到子查询中,这可能会有所帮助,具体取决于当前的执行计划。
标签: sql-server query-optimization