Oracle使用profiler来测试PL/SQL的性能
2016-02-19 10:01
621 查看
Oracle使用profiler来测试PL/SQL的性能
在Oracle中我们可以很容易的获取sql语句的执行计划,根据执行计划我们就可以基本上判断出该SQL语句的执行效率,那么我们怎么在Oracle中测试PL/SQL代码的执行效率呢?例如我们有一个存储过程testplsql,我想看一下这个存储过程在那一步比较耗时?这个时候我们就可以使用profiler来进行获取这个存储过程的执行效率,废话不多说,我们直接来看看profiler的使用。1.安装profiler
先在sys用户执行$ORACLE_HOME/rdbms/admin/profload.sql这个脚本,再在需要测试的PL/SQL代码的用户下执行$ORACLE_HOME/rdbms/admin/proftab.sql例如,在demo用户下有一个存储过程testplsql,我们现在想测试testplsql的运行效率,按照上面的步骤,先在sys用户下执行$ORACLE_HOME/rdbms/admin/profload.sql,再在demo用户下执行$ORACLE_HOME/rdbms/admin/proftab.sql
SQL> show user;
USER is "SYS"
SQL> @?/rdbms/admin/proftab.sql
drop table plsql_profiler_data cascade constraints
*
ERROR at line 1:
ORA-00942: table or view does not exist
drop table plsql_profiler_units cascade constraints
*
ERROR at line 1:
ORA-00942: table or view does not exist
drop table plsql_profiler_runs cascade constraints
*
ERROR at line 1:
ORA-00942: table or view does not exist
drop sequence plsql_profiler_runnumber
*
ERROR at line 1:
ORA-02289: sequence does not exist
Table created.
Comment created.
Table created.
Comment created.
Table created.
Comment created.
Sequence created.
SQL> conn demo/demo
Connected.
SQL> show user;
USER is "DEMO"
SQL> @?/rdbms/admin/proftab.sql
drop table plsql_profiler_data cascade constraints
*
ERROR at line 1:
ORA-00942: table or view does not exist
drop table plsql_profiler_units cascade constraints
*
ERROR at line 1:
ORA-00942: table or view does not exist
drop table plsql_profiler_runs cascade constraints
*
ERROR at line 1:
ORA-00942: table or view does not exist
drop sequence plsql_profiler_runnumber
*
ERROR at line 1:
ORA-02289: sequence does not exist
Table created.
Comment created.
Table created.
Comment created.
Table created.
Comment created.
Sequence created.
2.运行测试代码
在需要测试的存储过程的用户下执行下面的代码:declare
err number;
begin
err :=dbms_profiler.start_profiler(to_char(sysdate,'dd_Mon_YYYY hh:mi:ss'));
--此处请输入要测试的存储过程名
err :=dbms_profiler.stop_profiler;
end;
例如,我们要在测试demo用户下testplsql这个存储过程,则我们在demo用户下执行下面的代码:
declare
err number;
begin
err :=dbms_profiler.start_profiler(to_char(sysdate,'dd_Mon_YYYY hh:mi:ss'));
testplsql;
err :=dbms_profiler.stop_profiler;
end;
其中testplsql的代码为:
create or replace procedure testplsql is
anumber number;
ainteger integer;
anumber_10 number(10);
apls_integer pls_integer;
abinary binary_integer;
err number;
begin
anumber :=0;
loop
anumber :=anumber+1;
ainteger :=ainteger+1;
anumber_10 :=anumber_10+1;
apls_integer :=apls_integer+1;
abinary :=abinary+1;
exit when anumber>1500;
end loop;
end;
3.获取运行id
完成上面的第二步后,我们在需要测试的存储过程用户下执行下面的sql语句,来查询出运行的id:col run_commnet format a40 truncate;
select runid,run_date,run_comment from plsql_profiler_runs order by runid;
例如,接着我们在demo用户下执行上面这个语句:
SQL> select runid,run_date,run_comment from plsql_profiler_runs order by runid;
RUNID RUN_DATE RUN_COMMENT
---------- --------- ----------------------------------------
1 18-FEB-16 18_Feb_2016 05:17:09
2 19-FEB-16 19_Feb_2016 10:00:39
3 19-FEB-16 19_Feb_2016 10:02:18
根据run_comment可以判断出,我们这次测试的runid为3
4.获取测试结果
在3步中我们获取了runid后,这时我们就可以在需要的测试的存储过程用户下直接运行下面的sql语句来获取测试结果:col unit_name format a15 truncate;
col occured format 999999;
col line# format 99999;
col tot_time format 999.999999;
select p.unit_name,
p.occured,
p.tot_time,
p.line# line,
substr(s.text, 1, 75) text
from (select u.unit_name,
d.total_occur occured,
(d.total_time / 1000000000) tot_time,
d.line#
from plsql_profiler_units u, plsql_profiler_data d
where d.runid = u.runid
and d.unit_number = u.unit_number
and d.total_occur > 0
and u.runid = &run_id) p,
user_source s
where p.unit_name = s.name(+)
and p.line# = s.line(+)
order by p.unit_name, p.line#;
例如,我们在demo用户下运行上面的语句,则会得到下面的结果:
从结果中我们可以很清楚的看出存储过程每一步的耗时,以及发生的次数!
至此,使用profiler测试存储过程的效率已经完成!
相关文章推荐
- Uninstall Oracle Database 12c
- Oracle 建立索引及SQL优化
- oracle安装
- Oracle 11g 通过间隔分区实现按月创建表分区
- oracle通用分页语句rownum
- 说说自己学习Oracle的方法
- oracle之条件查询、模糊查询、运算符
- oracle 笔记
- Oracle12c中数据删除(delete)新特性之数据库内归档功能
- Oracle 11g导出的dmp文件导入到10g
- Oracle查询转换
- oracle面试题
- oracle11g密码效期及用户锁定
- oracle之去重与排序
- oracle参数之DEFERRED_SEGMENT_CREATION
- Oracle 常用函数
- 生产数据库要不要升级与ORACLE数据库支持服务内容和时限的问题
- Oracle ORA-01000: 超出打开游标的最大数
- oracle数据库知识点整理
- 移动表所在的表空间