我有以下访问查询,它工作正常。但是,现在大约需要大约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
这是Sub Query,基本上它从表中选择一堆数据。这发生在不到一秒钟。此查询的结果是按日期和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;
答案 0 :(得分:2)
您的[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]值,你可能会得到更快的响应。
答案 1 :(得分:0)
您需要的是多列索引,它几乎应该是即时的。
Use the interface,因为此链接描述了您是否需要帮助。但是,您的索引应该首先在条件上,在group by中使用的字段是次要的,所以我会有一个索引
TeamID,FirstName,LastName