当前位置:  数据库>oracle

使用 PL/SQL PROFILER 定位 PL/SQL 瓶颈代码

    来源: 互联网  发布时间:2017-05-27

    本文导语: 对于SQL的优化,可以借助于SQL tuning advisor实现自动SQL优化与调整。而对于PL/SQL代码而言,既有SQL代码,又有PL/SQL代码,仅仅使用10046事件是远远不够的,因为可能SQL时间很短,而整个包或过程执行时间N久,而且包或过程中又嵌套...

对于SQL的优化,可以借助于SQL tuning advisor实现自动SQL优化与调整。而对于PL/SQL代码而言,既有SQL代码,又有PL/SQL代码,仅仅使用10046事件是远远不够的,因为可能SQL时间很短,而整个包或过程执行时间N久,而且包或过程中又嵌套有其他包,过程,函数。看得你头皮发麻。尽管没有工具可以直接作用于PL/SQL代码进行优化,但借助于PL/SQL PROFILER来定位你的代码块中哪些部分是性能瓶颈就已经达到了事半功倍的效果。本文首先描述了安装PROFILER,接下给出在PL/SQL块中使用字面量与绑定变量时定义瓶颈块以及对比的情形,最后部分列出一些相关脚本。

1、配置PROFILER及演示环境

--演示环境
sys@USBO> select * from v$version where rownum conn scott/tiger;
Connected.
scott@USBO> @?/rdbms/admin/proftab.sql

b、使用sysdba帐户安装包DBMS_PROFILER,执行脚本profload.sql
scott@USBO> conn / as sysdba
Connected.
sys@USBO> @?/rdbms/admin/profload.sql

c、如果需要,创建plan_table,执行脚本utlxplan.sql
sys@USBO> @?/rdbms/admin/utlxplan.sql

sys@USBO> GRANT ALL ON sys.plan_table TO public;

sys@USBO> CREATE PUBLIC SYNONYM plan_table FOR sys.plan_table;

sys@USBO> conn scott/tiger;
Connected.

--创建演示表
scott@USBO> create table t1(id number,val number);

--创建一个基于字面量的过程
scott@USBO> create or replace procedure literals
  2  is
  3  v_num number;
  4  begin
  5  for i in 1..100000 loop
  6    v_num := dbms_random.random;             
  7    execute immediate
  8      'insert into t1 values ('||v_num||','||v_num||')';
  9  end loop;
 10  end;
 11  /

Procedure created.

2、使用PROFILER剖析PLSQL代码(法一)

a、启动profiler,调用过程start_profiler
scott@USBO> execute dbms_profiler.start_profiler('literals');

b、执行你需要剖析的代码(包,过程,匿名块等)
scott@USBO> exec literals;

c、停止profiler,调用过程stop_profiler
scott@USBO> execute dbms_profiler.stop_profiler;

d、查看profiler报告
scott@USBO> @chk_profile
Enter value for input_comment_name: literals
Enter value for input_sp_name: literals

TEXT                                                    TOTAL_OCCUR TOTAL_TIME MIN_TIME MAX_TIME
------------------------------------------------------- ----------- ---------- -------- --------
procedure literals                                                1        .0      .0      .0
procedure literals                                                3        .0      .0      .0
procedure literals                                                0        .0      .0      .0
 for i in 1..100000 loop                                    100001        .2      .0      .0
  v_num := dbms_random.random;                              100000        .8      .0      .0
  execute immediate                                        100000      49.9      .0      .0
 end;                                                            1        .0      .0      .0
procedure literals                                                2        .0      .0      .0

--上面的结果可以看出整个过程中execute immediate耗用49s中,也即是说,如果能够降低该行代码时间,则整个性能会大幅提升

3、使用PROFILER剖析PLSQL代码(法二)

--这个方法实际也没有太多的变化,只不过将需要剖析的代码和启用profiler与停止profiler封装到一个sql中
--下面创建一个使用绑定变量的示例来进行剖析
scott@USBO> create or replace procedure binds
  2  is
  3  v_num number;
  4  begin
  5  for i in 1..100000 loop
  6    v_num := dbms_random.random;
  7    insert into t1 values (v_num,v_num);
  8  end loop;
  9  end;
 10  /

Procedure created.

--直接调用call_profiler.sql(该代码封装了启动profiler,停止profiler)
scott@USBO> @call_profiler
Profiler started

PL/SQL procedure successfully completed.

Profiler stopped

Profiler flushed

runid:4

--Author : Leshami
--Blog  : http://blog.csdn.net/leshami

--查看profiler报告
scott@USBO> @evaluate_profiler_results
Enter value for runid: 4
Enter value for name: binds
Enter value for owner: scott

      Line      Occur        sec Text
---------- ---------- ---------- ------------------------------------------------------------
        1          0          0 procedure binds
        2                      is
        3                        v_num number;
        4                      begin
        5    100001      .182  for i in 1..100000 loop
        6    100000      .498    v_num := dbms_random.random;
        7    100000      3.756    insert into t1 values (v_num,v_num);
        8                        end loop;
        9          1          0 end;

9 rows selected.

Code% coverage
--------------
            80

--从上面的报告可知,当改用使用绑定变量后,原来执行insert语句的时间由49.9s下降到3.756s
--对于这个事例仅仅是演示定位瓶颈代码,并改用绑定变量以提高性能,对于其他情形,具体的如何修改瓶颈代码应具体分析

推荐阅读:

使用PL/SQL执行java存储来获得MAC地址

在SQL中使用PL/SQL函数存在的问题

 

更多精彩内容请看下一页:


    
 
 

您可能感兴趣的文章:

  • mysql的SQL_NO_CACHE(在查询时不使用缓存)和sql_cache用法
  • C#使用带like的sql语句时防sql注入的方法
  • 在SQL Server中使用SQL语句查询一个存储过程被其它所有的存储过程引用的存储过程名
  • SQL Server SQL Agent服务使用教程小结
  • 在使用中,经常出现提示为:java.sql.SQLException: [Microsoft][ODBC SQL Server Driver]连接占线导致另一个 hstmt,是什么意思,怎样解
  • SQL Server设置主键自增长列(使用sql语句实现)
  • sql server对索引的使用
  • 使用php语句将数据库*.sql文件导入数据库
  • SQL高级应用之使用SQL查询Excel表格数据的方法
  • sql server 使用ntile获取数据的例子
  • HBase上使用SQL查询 Phoniex
  • 如何使用SQL分页?
  • Oracle SQL使用时注意自己的输入
  • sql server中使用Unicode字符时要注意的问题
  • SQL Server 2008无日志文件如何使用MDF文件附加数据库
  • 大虾帮忙,怎样用JDBC-ODBC连接SQL2000并使用呀?
  • Oracle中SQL语句连接字符串的符号使用介绍
  • 关于java中执行sql语句使用order by的问题!
  • SQL SERVER使用REPLACE将某一列字段中的某个值替换为其他的值
  • MS SQL Server游标(CURSOR)的学习使用
  • sql 游标使用笔记
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • C++ I/O 成员 tellg():使用输入流读取流指针
  • 在测试memset函数的执行效率时,分为使用Cash和不使用Cash辆种方式,该如何控制是否使用缓存?
  • C++ I/O 成员 tellp():使用输出流读取流指针
  • 求ibm6000的中文使用手册 !从来没用过服务器,现在急需使用它,不知如何使用! 急!!!!!
  • Python不使用print而直接输出二进制字符串
  • 请问:在使用oracle数据库作开发时,是使用pro*c作开发好些,还是使用库函数如oci等好一些啊?或者它们有什么区别或者优缺点啊?
  • Office 2010 Module模式下使用VBA Addressof
  • 急求结果!!假设一个有两个元素的信号量集S,表示了一个磁带驱动器系统,其中进程1使用磁带机A,进程2同时使用磁带机A和B,进程3使用磁带机B。
  • windows下tinyxml.dll下载安装使用(c++解析XML库)
  • c#中SAPI使用总结——SpVoice的使用方法
  • tcmalloc内存泄露优化c++开源库下载,安装及使用介绍
  • 使用了QWidget的程序,如何使用后台程序启动它?
  • sharepoint 2010 使用STSNavigate函数实现文件下载举例
  • 共享内存一般是怎么使用的,是同消息队列配合使用么
  • 使用libpcap读取tcpdump抓取的文件并解析c代码实例
  • Jsp可否使用带有GUI的JavaBean,如何使用?
  • c/c++预处理命令预#,##使用介绍
  • asp程序使用的access在Linux下如何使用!
  • 在div中使用css让文字底部对齐的方法
  • 新装的Linux使用root用户不能使用FTP?
  • 在使用中,经常出现提示为:java.sql.SQLException: [Microsoft][ODBC SQL Server Driver]连接占线导致另一个 hstmt,是什么意思,怎样解 iis7站长之家
  • LINUX下使用Eclipse,如何使用交叉编译器?


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,