【问题标题】:How to improve efficiency of this query & VBA?如何提高此查询和 VBA 的效率?
【发布时间】:2013-03-11 03:33:50
【问题描述】:

我在 Access 中有这个查询:

SELECT TOP 10 title,
  ConcatRelated("DOCTEXT","DocumFrag", "title='" & title & "'" ) AS result
FROM DocumFrag
GROUP BY title;

DocumFrag 包含大约 9000 条记录,ConcatRelated 是 VBA 代码在这里找到:http://allenbrowne.com/func-concat.html

当我只针对 TOP 10 运行此查询并完成时,它会持续滞后到 20 秒的响应时间(点击、打字等)。

有没有办法可以改进它以使其更稳定?我以 TOP 10 为例来测试它是否滞后;最后我需要全选。

我这个查询的目标和Concatenating record values in database (MS Access) or in server side code (ASP.NET)一样(除了Access,不是ASP.NET)

或者有没有一种方法可以使用查询而不是 VBA 来完成?

【问题讨论】:

  • 用户定义的函数很慢。在大多数情况下,您还不如使用纯 VBA ,它甚至可能更快。
  • 也许尝试以Snapshot 运行此查询。或将结果输出到临时文件。表。
  • @Mike A Snapshot 仍然相当滞后,尽管帮助了大约 20%。
  • @JBurace 你打算如何使用结果?如果您将它们绑定到一次只显示一条记录的表单,问题可能会消失。如果您可以将它们导出到文件或临时表中。
  • @Mike 目的是让用户通过 Ctrl+F 浏览整个结果。但与此同时,“管理员”可能会定期更新查询从中提取的原始表。

标签: sql performance vba ms-access-2010


【解决方案1】:

我最好的猜测是 ConcatRelated 会评估“DocumFrag”中的每个“标题”。在应用函数之前选择内部查询中的前 10 个:

SELECT q.title, ConcatRelated("DOCTEXT","DocumFrag", "title='" & q.title & "'" ) AS result
FROM 
    (SELECT TOP 10 title FROM DocumFrag) AS q
GROUP BY q.title;

【讨论】:

  • 抱歉,更新了我的问题。最后我确实需要全选,前 10 名只是为了测试它的滞后程度。
  • 如果您删除“前 10”,您是否检查过查询是否需要相同的时间才能完成?
  • 我不知道查询完成时间,这不是问题所在。问题是,当此查询打开(但完成)时,所有 Access 都会滞后。
  • 如果问题是每一行都在运行 ConcatRelated,我的查询的 20 秒延迟应该短得多;如果您只删除“前 10 名”,则保持不变。
【解决方案2】:

是的,首先确保你的数据表有一个聚集索引(这决定了数据在磁盘上存储的顺序),否则你有一个堆,sql引擎需要查询整个表,因为数据可以在任何地方桌子。 2nd 在查询参数和要返回的数据上放置一个覆盖索引。第三,您正在尝试对文本进行分组?最好找到前 10 个项目,然后将与它们关联的文本合并,而不是像您的代码那样合并每个组项目,然后选择前 10 个。

【讨论】:

  • MS Access 中的聚集索引? SQL 是通用标签,这是 MS Access。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-20
  • 2017-02-27
  • 2021-09-22
  • 2022-06-15
  • 2012-06-30
  • 1970-01-01
相关资源
最近更新 更多