问题:

我们使用由我们最大的客户编写的程序来接收订单、预订运输以及执行其他与订单相关的操作。我们别无选择,只能使用该程序,而当涉及到他们的程序出现问题时,客户非常不支持。我们只需要接受这个计划。

现在,当与两个或更多用户一起使用时,该程序在大多数情况下都非常慢,因此我尝试查看幕后并找到问题的根源。

到目前为止我发现的关于该程序的一些要点:

  • 它是用 VB 6.0 编写的
  • 它使用受密码保护的 Access-DB (Access 2000 MDB),该数据库位于用户计算机上的一个文件夹中。
  • 该文件夹通过网络共享并由所有其他用户使用。
  • 它使用 msjet40.dll 版本 4.00.9704 与访问进行通信。我猜是ADO吧?

我也用过 过程监控器 监视文件访问并找出程序如此慢的原因:即使程序空闲,它也会对 mdb 文件执行数千次读取操作。通过网络,这当然非常慢:

进程监视器跟踪 http://img217.imageshack.us/img217/1456/screenshothw5.png

真正的问题:

有什么方法可以监控负责读取活动的查询吗?我可以设置跟踪标志吗?挂钩 JET DLL 吗?我猜想该程序正在执行一些昂贵的查询,导致 JET 在此过程中读取大量数据。

附:我已经尝试将 mdb 放在我们公司的文件服务器上,并取得了成功,访问它甚至比本地共享还要慢。我还尝试更改客户端上的锁定机制(机会锁定),但没有成功。

我想知道发生了什么,并需要为我们客户的开发人员提供一些确凿的事实和建议,以帮助他/她更快地编写程序。

有帮助吗?

解决方案

为了让你的脏手准确了解 Access 在幕后以查询方式执行的操作,有一个名为 JETSHOWPLAN 的未记录功能 - 当在注册表中打开时,它会创建一个 showplan.out 文本文件。详细信息在这篇科技共和国文章 备用, ,总结如下:

Jet 3.0 中添加了 ShowPlan 选项,该选项会生成一个文本文件 的查询计划。(ShowPlan 不支持子查询)。 您必须像这样在注册表中添加一个调试键来启用它:

\\HKEY_LOCAL_MACHINE\SOFTWARE\MICROSOFT\JET\4.0\Engines\Debug

在新的 Debug 键下,添加名为的字符串数据类型 JETSHOWPLAN(必须全部使用大写字母)。然后添加键值 ON 至 启用该功能。如果 Access 一直在后台运行,您可以 必须关闭它并重新启动它,该功能才会起作用。

启用 ShowPlan 后,Jet 将创建一个名为 SHOWPLAN.OUT(这可能最终会出现在你的 My Documents 文件夹或当前 默认文件夹,具体取决于您使用的 Jet 版本)的每个 的时间。然后您就可以查看该文本文件,从中找出线索 Jet 运行查询的方式。

我们建议您通过更改键值来禁用此功能 至 OFF 除非你专门使用它。Jet 将计划附加到 最后,这个过程实际上会减慢处理速度 下来。只有在需要查看特定内容时才打开该功能。 查询计划。打开数据库,运行查询,然后禁用 特点

对于追踪噩梦问题来说,它是无与伦比的 - 这是你在昂贵的大型工业数据库中得到的那种东西 - 这个功能很酷 - 它很可爱而且蓬松 - 这是我的朋友......;-)

其他提示

你不能在网络上放置一个数据包嗅探器(如 Wireshark)来观察一个用户和主机之间的流量吗?

如果它使用 ODBC 连接,您可以为其启用日志记录。

  1. 启动 ODBC 数据源管理器。
  2. 选择跟踪选项卡
  3. 选择立即开始跟踪按钮。
  4. 选择“应用”或“确定”。
  5. 运行应用程序一段时间。
  6. 返回 ODBC 管理器。
  7. 选择“跟踪”选项卡。
  8. 选择立即停止跟踪按钮。
  9. 可以在您最初在日志文件路径框中指定的位置查看跟踪。

第一个问题:您有 MS Access 2000 或更高版本的副本吗?

如果是这样:当您说 MDB 受“密码保护”时,您的意思是当您尝试使用 MS Access 打开它时,您只会提示输入密码,还是会提示您输入用户名和密码?(或者给您一条错误消息:“您没有使用 foo.mdb 对象所需的权限。”?)

如果是后者(用户级安全性),请查找与 MDB 一起的相应 .MDW 文件。如果找到的话,这就是“工作组信息文件”,用作打开 MDB 的“密钥”。尝试使用以下目标创建桌面快捷方式:

"Path to MSACCESS.EXE" "Path To foo.mdb" /wrkgrp "Path to foo.mdw"

然后,MS Access 应提示您输入用户名和密码(希望)与 VB6 应用程序要求您输入的用户名和密码相同。这至少允许您打开 MDB 文件并查看表结构以查看是否存在任何明显的设计缺陷。

除此之外,据我所知,Eduardo 是正确的,您非常需要能够在开发人员的源代码上运行调试器,以准确找出实时查询正在做什么......

如果没有开发人员的帮助,这是不可能的。对不起。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top