Dbms_hprof是Oracle11g推出的新特性,作用是分析pl/sql代码执行过程中性能评测分析。在本系列的前篇(http://space.itpub.net/17203031/viewspace-702694)中,我们已经介绍如何使用dbms_hprof进行性能测定以及结果分析。
使用dbms_hprof进行分析的结果数据可以以两种方式进行展现。一种是dbmshp_*数据系列表中,而另一种是生成html格式的报表文件。本篇中我们一起来尝试分析结果。
1、 跟踪文件trace file中结果分析
上篇中已经介绍过,对执行过程进行记录的文件是跟踪文件。其中保存了执行的所有原始过程信息。但是,我们称这种跟踪文件为原始结果文件,是不易进行阅读的。下面是一个跟踪文件片段。
P#V PLSHPROF Internal Version 1.0
P#! PL/SQL Timer Started
P#C PLSQL."".""."__plsql_vm"
P#X 5
P#C PLSQL."".""."__anonymous_block"
P#X 24
P#C PLSQL."SYS"."DBMS_TRANSACTION"::11."LOCAL_TRANSACTION_ID"#5e9fb91efaec8f19
(篇幅原因,省略…….)
Trace文件格式是一种符号记录方式,P#??类似于一种操作类型,后面跟着的就是操作的参数。下面是一些常用的操作类型。
指示符 | 含义 |
P#V | PLSHPROF版本信息显示,通常出现在文件头; |
P#C | 调用子程序,子过程; |
P#R | 从调用子程序中返回; |
P#X | 前后事件之间的时间延迟消耗; |
P#! | 注释信息; |
每种指示符类型对应不同的参数显示方式。P#C和P#R通常是配对出现的。这些语句中,只有P#C的参数类型比较复杂,如下所示:
ü Namespace:对应调用子程序的名字空间;
ü PL/SQL代码的Module名称;
ü PL/SQL代码的类型;
ü 调用子程序的名称;
ü 调用子程序的16进制hash计算值;
ü 调用子程序的行号;
例如我们trace文件中的最后一条P#C的含义:
P#C PLSQL."SYS"."DBMS_TRANSACTION"::11."LOCAL_TRANSACTION_ID"#5e9fb91efaec8f19
调用PLSQL命名空间下的sys.dbms_transaction模块。该模块的的内部类型编号为11。要调用方法LOCAL_TRANSACTION_ID子程序。该子程序的MD5内部哈希值16进制表示为“#5e9fb91efaec8f19”。
各种语句中,P#C的参数是最多的,其他都可以方便的进行猜测。
2、常见内部方法名称
所有的程序都不是独立运行的。PL/SQL是建立在Oracle PL/SQL引擎和SQL引擎基础上的一种程序语言。
所以,我们在调用PL/SQL代码块或者存储过程时候,就会遇到内部的方法和机制。在我们实验的程序中,也是遇到过的。
SQL> select module, type, function from dbmshp_function_info;
MODULE TYPE FUNCTION
-------------------- -------------------- ------------------------------
__anonymous_block
__plsql_vm
DBMS_HPROF PACKAGE BODY STOP_PROFILING
DBMS_TRANSACTION PACKAGE BODY LOCAL_TRANSACTION_ID
P_PROF_TEST PROCEDURE P_PROF_TEST
P_PROF_TEST PROCEDURE P_PROF_TEST.P1
P_PROF_TEST PROCEDURE P_PROF_TEST.P2
P_PROF_TEST PROCEDURE __static_sql_exec_line13
P_PROF_TEST PROCEDURE __static_sql_exec_line6
9 rows selected
标注为红色的都是内部执行的代码和函数。下面介绍一些特殊的函数名称方法。
Tracked Operation | Function Name | Namespace |
调用PL/SQL虚拟机 | _plsql_vm | PL/SQL |
PL/SQL匿名块 | _anonymous_block | PL/SQL |
包package初始化块 | _pkg_block | PL/SQL |
在第n行调用的静态sql代码 | _static_sql_exec_lineline# | SQL |
在第n行调用的动态sql代码 | _dyn_sql_exec_lineline# | SQL |
SQL Fetch操作 | _sql_fetch_lineline# | SQL |
3、常见报告结构分析
此处我们以生成的html格式报表为例进行分析。首先我们打开实验生成m.html格式报告。可以看到生成一共若干个报告链接,分别从不同角度进行性能排序。
各种类型的分析报告中,我们可以看出主要进行排序的依据就是消耗时间的多少。不同报表分别从不同的Subtree、Function、Modual、Function Call等方面进行排序。
进入报告“Function Elapsed Time (microsecs) Data sorted by Total Function Elapsed Time (microsecs)”,可以看到不同函数的调用过程测试和执行时间。
明显可见,是两个静态sql执行代码执行次数和消耗时间最多。进入line6的记录,可以看出该sql语句的详细上下文对应关系。
对一个代码方法,报告会列出该方法的调用方法和被调用方法,并且依次列出相互之间的时间消耗情况比例。
4、结论
本篇我们着重分析了DBMS_HPROF程序包的结果集合。Oracle PL/SQL代码是我们经常使用的工具,使用dbms_hprof可以一定程度上帮助我们进行性能调试。不过,笔者个人感觉该包的方法集中在消耗时间上,过于偏颇。如果能够将CPU和各类型空间消耗一并加入,应该会是一个很成熟的产品。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/17203031/viewspace-702785/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/17203031/viewspace-702785/