如何查找应用程序的数据库往返次数

时间:2011-01-31 16:41:41

标签: java oracle profiling

我是一名java程序员,我想知道我的应用程序完成了多少次数据库调用/旅行。我们使用Oracle作为关系数据库 通过oracle,我了解了一种改变会话统计信息并生成跟踪文件的方法。以下是要解雇的查询:

ALTER SESSION SET TIMED_STATISTICS = TRUE;

 ALTER SESSION SET SQL_TRACE = TRUE;

生成跟踪文件后,可以使用TKProf实用程序读取它们。但是这种方法不能用,因为:

  1. 我的应用程序使用hibernate和spring框架,因此应用程序没有会话句柄。
  2. 即使我们获得了跟踪文件,我也需要知道这组查询是一次性(一次性)还是单独激发。我不确定TkProf输出是否有助于理解这一点。
  3. 有没有人有更好的建议?

3 个答案:

答案 0 :(得分:3)

在TkProf中,您基本上可以将往返次数称为“调用次数”(尽管有例外情况,因此需要较少的往返次数,例如理论上单行选择的解析/执行/获取) ,可能在一次往返中,所谓的“精确获取”特征oracle)。然而作为估计,tkprof数据已经足够好了。

如果跟踪等待事件,您应该直接在原始跟踪中看到'SQL * Net from / to client'等待事件,但我认为tkprof没有显示它(不确定,试一试)。

另一种方法是查看会话统计信息:

select value
  from v$mystat ms, v$statname sn
 where ms.value > 0
   and ms.statistic#=sn.statistic#
   and sn.name IN ('SQL*Net roundtrips to/from client')

但是,如果您在自己的应用中执行该操作,则会降低您的应用速度,并且您收到的数据将包括该次选择的往返次数。

A写了几篇关于往返优化的文章:

答案 1 :(得分:2)

首先,为此测试使用专用数据库(或时间范围),因此不容易与其他会话混淆。

其次,查看视图v $ session以识别hibernate的会话。 USERNAME,OSUSER,TERMINAL,MACHINE应该明白这一点。 SID和SERIAL#列唯一标识会话。实际上SID在任何时候都是独一无二的。只有在会话断开连接并重新连接时才需要SERIAL#。

第三,使用v $ sessstat(在SID上过滤,从v $会话中过滤掉SERIAL#)和v $ statname(由Markus显示)来提取往返次数。您可以在测试之前拍摄快照,运行测试,然后再次查看值并确定完成的工作。

那就是说,我不确定它本身是一个特别有用的措施。 TKPROF将更加详细,更加注重时间(这是一个更有用的措施)。

答案 2 :(得分:1)

最好是获得运行会话的专用事件10046 12级跟踪文件。您将在那里找到所有详细信息。这意味着您可以查看应用程序将对每个执行的命令执行的提取次数以及相关的等待事件/已用时间。可以使用Oracle中的工具(如TKPROF或Oracle Trace Analyzer)或第三方工具(如[QueryAdvisor] [1])分析结果。

顺便提一下,您可以让DBA定义一个数据库触发器,在登录后自动激活Oracle filetrace。因此捕获文件应该不是问题。

R.U。

[1]:http://www.queryadvisor.com/“使用QueryAdvisor进行TKPROF Oracle跟踪文件分析”