访问查询 MAX() 减慢查询
Posted
技术标签:
【中文标题】访问查询 MAX() 减慢查询【英文标题】:Access Query MAX() Slows Query 【发布时间】:2014-01-27 03:04:04 【问题描述】:我有以下访问查询,它工作正常。但是,现在大约需要 8-10 秒才能完成大约 700 条记录的表。 FROM
是另一个查询时间非常短的查询。我已将其范围缩小到 MAX()
函数,因为当我删除该函数时,它会以非常短的查询时间运行。我能做些什么来加快速度?我将假设随着更多数据进入数据库,查询所需的时间越长。
SELECT FirstName, LastName, TeamID, MAX(total) AS totalMax
FROM attendanceViewAll
WHERE TeamID IN(5,9,13)
GROUP BY FirstName, LastName, TeamID
这里是子查询,基本上它从一个表中选择一堆数据。这会在不到一秒的时间内发生。此查询的结果是按日期和agentID
排序的所有内容。然后我使用上面的查询来查找MAX(total)
,这样我就可以对代理进行分组以获得摘要。我也将以下查询用于其他报告。
SELECT
a1.TeamID,
a1.FirstName,
a1.LastName,
a1.incurredDate,
a1.points,
a1.OneFallOff,
a1.TwoFallOff,
(select sum(a2.actualPoints)
from attendanceView as a2 where a2.agentID = a1.agentID and a2.incurredDate <= a1.incurredDate) as total,
a1.comment, a1.linked, a1.FallOffDate
FROM attendanceView as a1;
【问题讨论】:
你如何组装你的attendanceViewAll
视图?
在不知道子查询做什么的情况下,提出优化策略是没有意义的。
我已使用其他查询进行了编辑。
也请attendanceView
【参考方案1】:
您的 [attendanceViewAll] 查询正在使用相关子查询来生成运行总数(参考:您之前的问题 here)。现在您要查询该运行总计的 MAX(),这与 [TwoFallOff] 值的 SUM() 相同。也就是说,对于
incurredDate TwoFallOff total
------------ ---------- -----
2014-01-10 2 2
2014-01-11 3 5
2014-01-12 1 6
MAX(total) 与 SUM(TwoFallOff) 的值相同。最大的区别在于,要获取 [total] 的每个值,您需要运行相关子查询,而要获取 [TwoFallOff] 的每个值则不需要。
换句话说,我怀疑您当前的查询速度很慢,因为 MAX() 迫使 [attendanceViewAll] 中的相关子查询被执行多次。如果您让当前查询直接返回 [attendanceView] 和 SUM() 那里的 [TwoFallOff] 值,您可能会得到更快的响应。
【讨论】:
【参考方案2】:您需要的是一个多列索引,它应该几乎是即时的。
Use the interface 因为此链接描述了您是否需要帮助。但是,您的索引应该首先在标准上,其次是在 group by 中使用的字段,所以我会有一个索引
团队 ID、名字、姓氏
【讨论】:
我已经有了我的表,其中包含以这种方式索引的代理名称。我确实没有运气改变了小组的顺序,仍然是 8-10 秒。以上是关于访问查询 MAX() 减慢查询的主要内容,如果未能解决你的问题,请参考以下文章
MongoDB,即使它们形成分区,查询字段也会减慢查询速度吗?
为啥 MYSQL 更高的 LIMIT 偏移量会减慢查询速度?