Oracle使用profiler来测试PL/SQL的性能_plsql 负载测试_梦想家没有梦想的博客-程序员秘密

技术标签: oracle  

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测试存储过程的效率已经完成!
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/ll1058320115/article/details/50687480

智能推荐

C++智能指针auto_ptr源码完全解析---以微软auto_ptr为例来探讨auto_ptr的用法_涛歌依旧的博客-程序员秘密

对于C/C++程序员来说, 内存泄露是一个谈之色变的话题, 很多时候, 机器运行1天2天都是ok的, 但运行到一个星期后, 就卡得要死。 实际上, 很多时候是内存泄露造成的。 内存泄露很容易引入, 但是定位起来非常非常难, 在内存泄露初期, 通常没有异常症状, 但随着内存泄露的累积, 内存逐渐被啃光, 最终导致卡死或者死机。 申请堆内存, 又没有正确释放, 就会导致内存泄露

mobi格式电子书_中英文电子书下载网站大搜罗_weixin_39529903的博客-程序员秘密

今天,给大家一点福利~来个电子书下载网站的大搜罗,爱阅读爱思考的小伙伴有福啦...电子书分类及阅读工具科普常见的电子书格式主要有pdf、epub、mobi、azw3、caj、pdg、pdz、djvu、uvz、umd、keb、chm、ceb、txt、ps等。手机上epub格式推荐用掌阅iReader、fbreader等来阅读,mobi格式推荐用Kindle App阅读。iOS上(iPhone、iPa...

zip_zip csdn_荏苒夕阳的博客-程序员秘密

import java.util.*;import java.io.*;import org.apache.tools.zip.*; /** * Author:lixiaoning * Date:2009-4-7 */public class Zipper{    private static String unrarCmd = "C:\\Program Fil

XML解析_Dom4j_从零开始的java小白的博客-程序员秘密

1.解析方式和解析包 解析方式: 常见有三种解析方式 1.DOM:要求解析器把整个XML文件装在到内存,并解析成一个Document对象 优点:元素与元素之间保留结构关系,我们可以很方便的对其进行增删改查 缺点:XML文档过大的话,可能出现内存溢出 2.SAX:是一种速度更快,更有效的方式,它是逐行扫描,一边扫描一边解析,并且以事件驱动方式进行具体...

多元线性回归的spss应用_多元线性无序分类虚拟化处理方法_橙子和甜甜的小屋的博客-程序员秘密

多元线性回归的spss应用我们先从一元回归引入。对于一元的回归,方法选择哪一个都没有太大影响。第一个表格描述的是方程解释现实情况的程度,为84.8%,第二个表格则是方差分析,可以从最后一列推断出通过方差分析,唯一的自变量前的系数不为零,第三个表用于判断取标准化系数还是非标准化系数,如果常数项的检验值小于0.05则取非标准化系数(B),否则取标准化系数(BETA)。接下来来到多元回归了,先...

拳王虚拟项目公社:闲鱼虚拟资源玩法案例拆解,教你玩转虚拟资源,货源+方法_虚拟资源选品_拳王公社的博客-程序员秘密

很多人都是学生,或者宝妈,想在学习、工作之余,0投入,赚取一份额外的收入,补贴家用,但是很多东西都很麻烦,比如需要选品,甚至需要囤货,那么最简单的可以上手的,就是虚拟资源了。今天我们就来实际案例拆解,除了分享玩法,最后可以免费领取一份货源渠道哦。目前在闲鱼售卖的虚拟货源,有以下几种类型:各类破解、正版软件、游戏影视会员类产品电子书籍、资料大部分的虚拟资源可以分成以上三类,所有的虚拟资源玩法也都类似。今天我们以影视会员为例,进行案例拆解,详细的告诉你怎么玩转虚拟资源。虚拟资源在哪里?这个在公

随便推点

网站分享:7个非常好用的电子书网站_电子版书怎么搜 csdn_IT技术分享社区的博客-程序员秘密

今天小编给大家分享7个非常好用的电子书阅读网站,值得收藏!

嵌入式linux录像机,【16路NRV 硬盘录像机 16路嵌入式NVR Linux系统】 - 太平洋安防网..._火锅大魔王的博客-程序员秘密

【参数说明】品牌:ANAGAL(艾诺亚)【详细描述】·:艾诺亚·型号:AI-NVR16·接口:BNCVGAHDIM·压缩格式:H.264·用途:服务器PC DVR·同城服务2:同城物流送货上门本产品是专为安防领域设计的一款**的数字监控存储设备。采用LINUX操作系统,系统运行稳定;通用的H.264的视频压缩与G.711音频压缩技术实现了高画质、低码率的音视频预览和录制功能...

Android Hook式插件化教程(一)Hook从入门到精通_安卓hook教程_不羁的李先森的博客-程序员秘密

Android Hook式插件化教程(一)Hook从入门到精通1.hook的定义hook,顾名思义就是钩子。而在我们开发中通俗来讲就是劫持,就是某段SDK源码逻辑执行的过程中,通过代码手段劫持拦截执行该逻辑,加入自己的代码逻辑。2hook的价值hook是中级开发通往高级开发的必经之路。如果把谷歌比喻成 安卓的造物主,那么安卓SDK源码里面就包含了万事万物的本源。中级开发者,只在利用万事...

倍洽福利 | 满满惊喜 倍洽开启双十一模式_chilang2737的博客-程序员秘密

倍洽双十一活动如期而至~充值返券,活动抽奖,丰富福利尽在十一月。充值特惠,更低成本带来更高效率在活动期内,通过支付宝、网银、线下对公支付等方式,以现金充值成功,即可获得等于充值金额 10% 的倍洽礼品券返还。双十一,倍洽助力团队以更低成本,享受更高效率。升级有奖,丰富礼品重磅来袭活...