访问查询MAX()减慢查询

时间:2014-01-27 03:04:04

标签: sql ms-access-2010

我有以下访问查询,它工作正常。但是,现在大约需要大约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;

2 个答案:

答案 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