Oracle PL/SQL高级编程(第五弹:性能优化:使用DBMS_PROFILER包)

对于已经存在的代码,找出影响性能的问题点至关重要,Oracle提供的DBMS_PROFILER包可以方便地发现其瓶颈所在。

安装DBMS_PROFILER

在使用DBMS_PROFILER之前,要以管理员身份进入数据库系统进行安装。
1. 使用管理员身份登录,使用DESC命令判断DBMS_PROFILER包是否存在:DESC DBMS_PROFILER;
2. 如果DESC命令提示DBMS_PROFILER包不存在,则需要使用如下命令安装:@?/rdbms/admin/profload.sql
3. 再次运行DESC DBMS_PROFILER,可以看到这个包中包含的子程序的信息。使用的函数主要有两个:start_profiler用来启动PROFILER,stop_profiler用来停止PROFILER。

配置PROFILER方案

创建一个用来存放跟踪信息的用户,以及PROFILER相关的表的同义词:

CREATE USER profiler IDENTIFIED BY 12345;
grant connect, resource to profiler;
CREATE PUBLIC SYNONYM plsql_profiler_runs FOR profiler.plsql_profiler_runs;
CREATE PUBLIC SYNONYM plsql_profiler_units FOR profiler.plsql_profiler_units;
CREATE PUBLIC SYNONYM plsql_profiler_data FOR profiler.plsql_profiler_data;
CREATE PUBLIC SYNONYM plsql_profiler_runnumber FOR profiler.plsql_profiler_runnumber;

配置PROFILER表

在创建了需要的同义词以后,接下来在profiler方案下创建所需的表,以profiler登录执行如下的配置代码:
@?/rdbms/admin/proftab.sql
接下来为这些表分配PUBLIC角色,以便任何人都可以对这几个表仅访问:

GRANT SELECT ON plsql_profiler_runnumber TO PUBLIC;
GRANT SELECT,INSERT,UPDATE,DELETE ON plsql_profiler_data TO PUBLIC;
GRANT SELECT,INSERT,UPDATE,DELETE ON plsql_profiler_units TO PUBLIC;
GRANT SELECT,INSERT,UPDATE,DELETE ON plsql_profiler_runs TO PUBLIC;

这几个表的含义如下:
- plsql_profiler_runs:保存在PROFILER的运行信息
- plsql_profiler_units:保存每个单元的PROFILER信息
- plsql_profiler_data:保存了每个单元的详细数据
- plsql_profiler_runnumber:用来生成PROFILER唯一运行编号的序列

执行PROFILER获取配置信息

在创建了过程之,就可以使用PROFILER来检测程序代码了。下面的代码创建了一个sp_test的过程,该过程将向pro_tst_table添加10000条记录:

CREATE TABLE pro_tst_table (a INT);        --创建测试表
CREATE OR REPLACE PROCEDURE sp_test        --创建测试过程
AS
BEGIN
   FOR i IN 1 .. 10000
   LOOP
      INSERT INTO pro_tst_table            --向表中插入10000行记录
           VALUES (i);
   END LOOP;
   COMMIT;
END;
/

编写了要测试的过程后,就可以使用DBMS_PROFILER包提供的相关功能来进行测试了:

DECLARE
   v_run_number   integer;            --保存PROFILER的运行号码
BEGIN
   --启动PROFILER
   DBMS_PROFILER.start_profiler (run_number => v_run_number);
   --显示当前跟踪的运行序号(后面查询要用)
   DBMS_OUTPUT.put_line ('run_number:' || v_run_number);
   --运行要跟踪的PLSQL
   sp_test;
   --停止profiler
   DBMS_PROFILER.stop_profiler;
END;
/

查询PROFILER获取结果

要使用SQL语句查询本次执行的信息,可以先查询plsql_profiler_runs表获取本次执行的基本信息,查询plsql_profiler_units表可以得到本次PROFILER时的单元信息,查询plsql_profiler_data表可以根据行号和单元号获得执行的存储过程的每一行的统计信息。
尽管通过查询这些表可以获得统计的信息,但是数据看起来比较复杂,因此可以先通过PL/SQL Developer等可视化工具来进行PROFILER。

使用PL/SQL Developer来观察PROFILER结果

先打开一个空白的测试窗口,将前面使用了DBMS_PROFILER包的代码复制进来,按F9执行并调试代码,在代码执行完成后,切换到概览图标签页,可以看到在概览图中产生的PROFILER单元信息。

你可能感兴趣的:(Oracle)