2014-01-27 68 views
0

我有下面的Access查询,它工作正常。然而,现在大约需要8-10秒才能完成大约700条记录。 FROM是查询时间很少的另一个查询。我已经缩小到MAX()函数,因为当我删除该函数时,它运行的查询时间很少。我能做些什么来加快速度?我将假设随着更多数据进入数据库,查询需要的时间越长。访问查询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; 
+0

你如何组装你的'attendanceViewAll'视图? – Brad

+0

不知道子查询是什么,建议优化策略是没有意义的。 –

+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(总)与SUM(TwoFallOff)的值相同。最大的区别是,为了获得[总数]的每个值,您需要运行相关的子查询,而为[TwoFallOff]获取每个值则不需要。

换句话说,我怀疑你当前的查询很慢,因为MAX()强制执行[attendanceViewAll]中的相关子查询很多次。如果您将当前查询直接返回[attendanceView]和SUM()从那里的[TwoFallOff]值,您可能会得到更快的响应。

0

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

Use the interface因为此链接描述您是否需要帮助。然而,索引应该是第一上的标准,次要对在组中使用的字段,因此我会对

TeamID,名字,姓氏

+0

我已经有我的表包含代理名称索引的方式。我确实没有运气改变组的顺序,仍然是8-10秒。 –