我想知道查询正在读取哪些表。
对于CustomerID = 12345的每个客户。
最终这个客户将在以下示例中找到,但进度必须“读取”许多…
你似乎在混淆一些不同的东西。
在您的示例中,您在一个中查找特定记录,而只有一个表,那么只读取一个记录。进度将通过首先扫描相关指数来找到该记录。这可能是b树的2或3“逻辑读取”到达正确的节点。记录块和索引块可以从磁盘读取,也可以不从磁盘读取 - 这取决于先前发生的情况。
有“虚拟系统表”可以告诉您对特定表或索引进行了多少次READ操作。但是它们不跟踪特定的ROWID或其他识别数据。 _TableStat和_IndexStat是系统上所有用户的聚合,_UserTableStat和_UserIndexStat特定于特定用户的活动。您需要充分设置-tablerangesize和-inrangerangesize参数以利用这些参数。
如果您启用了表和索引统计信息,那么您可以使用像ProTop这样的工具 - http://protop.wss.com 深入了解此活动。或者你可以编写自己的代码。
OpenEdge审计不跟踪读取。那将是非常昂贵的。
这可能不是一个好主意,但理论上,您可以为您感兴趣的表编写FIND触发器。这不需要访问应用程序源,但您需要开发许可证。尽管如此,它可能会扼杀性能 - 所以除非这是一个非生产测试环境,你只想摆弄它,否则我不会那样做。
你提到想知道你是如何达到这一点的。这听起来更像是你可能需要一个“4gl跟踪”。获取正在运行的进程的堆栈跟踪的一种简单方法是执行:
$DLC/bin/proGetStack PID (UNIX) or %DLC%\bin\proGetStack PID (Windows)
此命令将生成一个“protrace.pid”文件,其中包含4gl堆栈跟踪和其他有趣信息。
还有更复杂的方法来获取该信息,例如使用PROMON和“客户端语句缓存”或在会话启动时设置各种日志条目类型。但是proGetStack非常方便,不需要代码或脚本更改。
汤姆以上的一些很好的选择。所有这些都可能与您相关。他只围绕的选项是记录选项。我觉得有必要对此进行扩展,因为我会在几周内就此发表演讲! 假设您正在运行Progress的现代版本,甚至是10.2B08,那么您可以使用客户端日志记录。使用以下附加选项开始您的会话: -clientlog“\ somefolder \ somefile.txt” -logentrytypes“QryInfo:3” 这会将会话中所有查询的所有信息记录到您上面指定的文件中。如果导航到系统中要分析查询并清空日志文件并保存日志文件的位置,则可以运行有问题的查询并查看所需的所有详细信息。 输出会告诉您各种有用的信息,包括每个表上的读取次数,以及返回给用户的次数。您还可以选择索引。 使用汤姆的建议和/或这将为您提供所需。