对于已经存在的代码,找出影响性能的问题点至关重要,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相关的表的同义词:
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登录执行如下的配置代码:
@?/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来检测程序代码了。下面的代码创建了一个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;
/
要使用SQL语句查询本次执行的信息,可以先查询plsql_profiler_runs
表获取本次执行的基本信息,查询plsql_profiler_units
表可以得到本次PROFILER时的单元信息,查询plsql_profiler_data
表可以根据行号和单元号获得执行的存储过程的每一行的统计信息。
尽管通过查询这些表可以获得统计的信息,但是数据看起来比较复杂,因此可以先通过PL/SQL Developer等可视化工具来进行PROFILER。
先打开一个空白的测试窗口,将前面使用了DBMS_PROFILER
包的代码复制进来,按F9执行并调试代码,在代码执行完成后,切换到概览图标签页,可以看到在概览图中产生的PROFILER单元信息。