访问查询 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 偏移量会减慢查询速度?

在某些情况下,为什么CTE(公用表表达式)与SQL Server中的临时表相比会减慢查询速度

Redis 慢查询

如何减慢postgresql服务器的速度?

redis设置慢查询日志