您能否在运行时在 Progress-4GL/Openedge 中的特定 RECID(表名)上获取 'reads' 的日志文件,而无需访问源代码?

Can you get a log file of 'reads' on specific RECID(Tablename) in Progress-4GL/Openedge at RunTime without access to Source Code?

我想知道查询正在读取哪些表。

对于 CustomerID = 12345 的每个客户。

最终将在以下示例中找到该客户,但在到达客户 12345 之前,进度必须 'read' 很多表。

在到达客户 12345 之前,我如何准确地知道哪些表被读取(通过 CustomerID)?

*注意:我无权修改此选择的 运行 代码。理想情况下,我会 运行 一组单独的代码,与上面的客户查询同时执行以跟踪读取。

编辑:更清楚 - 您能否跟踪给定程序 (.p) 或 ProcessID 的读取并将 RECID 或 PrimaryKey 输出到文件?
我知道信息正在从磁盘中读取并可能存储在数据库缓冲区中。那么我如何获取数据库缓冲区中的信息呢?

你似乎混淆了一些不同的东西。

在像您的示例这样的情况下,您在其中找到一条特定记录,并且只有一条 table 那么只有一条记录被读取。 Progress 将通过首先扫描相关索引找到该记录。这可能是 b 树的 2 或 3 "logical reads" 才能到达正确的节点。记录块和索引块可能会也可能不会从磁盘读取 - 这取决于之前发生的情况。

有 "Virtual System Tables" 可用,可以告诉您针对特定 table 或索引发生了多少次 READ 操作。但他们不会追踪特定的 ROWID 或其他识别数据。 _TableStat 和 _IndexStat 是系统上所有用户的聚合,_UserTableStat 和 _UserIndexStat 特定于特定用户的 activity。您确实需要充分设置 -tablerangesize 和 -indexrangesize 参数以利用这些参数。

如果您启用了 table 和索引统计信息,那么您可以使用像 ProTop - http://protop.wss.com 这样的工具来深入了解这个 activity。或者您可以编写自己的代码。

OpenEdge Auditing 不跟踪读取。那将是非常昂贵的。

这可能不是一个好主意,但从理论上讲,您可以为您感兴趣的 table 编写 FIND 触发器。这不需要访问应用程序源,但您需要一个开发许可证。这样做可能会降低性能 - 所以除非这是一个你只想 fiddle 的非生产测试环境,否则我不会真的那样做。

你提到想知道你是如何走到这一步的。这听起来更像是您可能需要“4gl 跟踪”。获取 运行 进程堆栈跟踪的一种简单方法是执行:

 $DLC/bin/proGetStack PID    (UNIX)
or
 %DLC%\bin\proGetStack PID    (Windows)

此命令将生成一个 "protrace.pid" 文件,其中包含一个 4gl 堆栈跟踪和其他有趣的信息。

还有更复杂的方法来获取该信息,例如使用 PROMON 和 "client statement cache" 或在会话启动时设置各种日志条目类型。但是 proGetStack 非常方便,不需要更改代码或脚本。

上面 Tom 的一些很棒的选择。所有这些都可能与您有关。他只绕过的选项是日志记录选项。我觉得有必要对此进行扩展,因为我将在几周后就此发表演讲!
假设您使用的是 运行Progress 的现代版本,甚至是 10.2B08,那么您可以使用客户端日志记录。使用这些附加选项开始您的会话:
-客户端日志“\somefolder\somefile.txt”
-logentrytypes "QryInfo:3"
这会将您会话中所有查询的所有信息记录到您在上面指定的文件中。如果您导航到系统中要分析查询的位置并清空日志文件并保存它,那么您可以 运行 有问题的查询并查看您需要的所有详细信息。 输出会告诉您各种有用的信息,包括每个 table 的读取次数与返回给用户的次数的比较。您还可以选择索引。
采纳 Tom 的建议 and/or 这将为您提供所需的东西。