访问查询max()减慢查询



i具有以下访问查询,并且效果很好。但是,在现在大约700张记录的桌子上完成大约需要8-10秒的时间。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;

您的[atcationViewall]查询正在使用相关的子查询来产生运行总数(参考:您以前的问题在此处)。现在,您要求该运行总数的最大值()与[TwoFalloff]值的sum()相同。也就是说

incurredDate  TwoFallOff  total
------------  ----------  -----
  2014-01-10           2      2
  2014-01-11           3      5
  2014-01-12           1      6

max(总数)与sum(TwoFalloff)相同。最大的区别是要获得[总数]的每个值,您需要运行相关的子查询,而要获得[Twofalloff]的每个值。

换句话说,我怀疑您的当前查询很慢,因为Max()正在强迫[ActinanceViewall]中的相关子查询多次执行。如果您的当前查询直接返回[atcationView]和sum()[twofalloff]值。

,您可能会得到更快的响应。

您需要的是多列索引,它几乎应该是瞬时的。

使用该界面,因为此链接描述了是否需要帮助。但是,您的索引应首先在标准上,在组中使用的字段中的次要,因此我将在

上有一个索引

teamId,firstName,lastname

最新更新