Microsoft JET SQL 查询日志记录或“如何调试客户的程序?”
题
问题:
我们使用由我们最大的客户编写的程序来接收订单、预订运输以及执行其他与订单相关的操作。我们别无选择,只能使用该程序,而当涉及到他们的程序出现问题时,客户非常不支持。我们只需要接受这个计划。
现在,当与两个或更多用户一起使用时,该程序在大多数情况下都非常慢,因此我尝试查看幕后并找到问题的根源。
到目前为止我发现的关于该程序的一些要点:
- 它是用 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 连接,您可以为其启用日志记录。
- 启动 ODBC 数据源管理器。
- 选择跟踪选项卡
- 选择立即开始跟踪按钮。
- 选择“应用”或“确定”。
- 运行应用程序一段时间。
- 返回 ODBC 管理器。
- 选择“跟踪”选项卡。
- 选择立即停止跟踪按钮。
- 可以在您最初在日志文件路径框中指定的位置查看跟踪。
第一个问题:您有 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 是正确的,您非常需要能够在开发人员的源代码上运行调试器,以准确找出实时查询正在做什么......
如果没有开发人员的帮助,这是不可能的。对不起。