【问题标题】:Access 2007 First cn.Execute Statement very slowAccess 2007 First cn.Execute 语句很慢
【发布时间】:2011-06-22 06:13:04
【问题描述】:

我目前正在使用分离的 FE 和 BE 在 Access 2007 中开发应用程序。 FE 是本地的,而 BE 在网络共享上。为了消除在网络上使用链接表时发现的一些问题,我尝试通过 VBA 使用 ADO,在应用程序首次使用 cn.Execute "INSERT INTO TempTable1 SELECT * FROM LinkedTable1" 和 cn.Execute "INSERT INTO TempTable2 SELECT * FROM LinkedTable2"。

LinkedTable1 有 45,552 条记录,LinkedTable2 有 45,697 条记录。

第一个执行语句需要 50-85 秒。但是第二个执行语句不超过 9 秒。这些时间是一致的。为了查看其中一个表而不是另一个表是否存在问题,我已经切换了代码中语句的顺序,并且时间仍然相同(第一次执行太长,第二次执行非常快速地)。 (作为旁注,我也尝试使用 CurrentDB.Execute 命令进行 DAO,但没有不同的结果。)如果第一个语句处理的记录多于第二个,这对我来说是有意义的,但虽然数量很少,但第二个表记录比第一个多!

是否有人对为什么会发生这种情况和/或如何让第一个执行语句加快速度有任何建议?

提前致谢! 哇

【问题讨论】:

  • 您在使用网络上的链接表时遇到了哪些问题?如果是有线网络,带宽至少10Mbps,Access链表访问应该没问题。

标签: ms-access ms-access-2007


【解决方案1】:

您在两个临时表上定义了哪些索引,以及主键定义?在追加数据时更新索引可能是一个表变慢的原因之一。

【讨论】:

  • 结构相同,包括索引。两个表都没有定义主键。我尝试在插入之前从临时表中删除所有索引。对此进行的多次试验提供了大约 10 秒的第一个插入物增加,而第二个没有增加。所以我仍然在看第一个是 50s,第二个是 7s。
  • 两个表都没有主键?这就是问题所在——您需要一个主键来避免将整个表格拉过电线。实际上,真正的数据库永远不会有没有 PK 的表,即使它们只是作为存储在表中的数据的一部分并没有任何意义的代理键。
【解决方案2】:

我的猜测是差异有两个来源:

  1. 执行第一条 INSERT 语句时远程 LDB 文件的初始创建。这在第一个 SQL 命令中显示为开销,而实际上这两个命令都存在。

  2. 缓存:可能文件足够小,以至于 Jet/ACE 在第一次操作期间通过网络(标头和元数据,加上请求的数据页)拉取其大块,从而减少数据发出第二个命令时,它还没有在本地内存中。

我的问题是为什么您首先会遇到链接表性能问题。解决这个问题,您就不必为临时表而烦恼。见Tony Toews's Performance FAQ

【讨论】:

  • 我希望我知道为什么我会遇到链接表性能问题。使用 BE local,代码可以在几秒钟内执行。在网络上使用 BE,响应时间是可怕的,这促使我想到了临时表的想法。我会责怪网络,除了第二个选择语句执行得如此之快。我已经通过了您链接中提到的所有选项 - 无济于事。我对缓存知之甚少..您还可以提供更多信息吗?谢谢!
  • 您不必担心缓存——使用 Jet/ACE 默认值。他们在 99.999% 的时间里都会没事的。数据必须通过网络传输。但是,如果您将 100 条数千条记录放入临时表中,您就不能指望它会很快!我认为根据需要简单地检索少量记录(一次少于 100 条)而不是直接绑定到临时表中会更有效。
猜你喜欢
  • 1970-01-01
  • 2014-10-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-14
  • 1970-01-01
相关资源
最近更新 更多