如何在Oracle中查找存储过程的成本并对其进行优化

时间:2013-02-08 07:41:34

标签: performance oracle stored-procedures plsql query-optimization

如果有任何方法可以找出Oracle中存储过程的成本,有人可以告诉我吗?如果没有直接的方式,我想知道任何替代品 我发现成本的方法是对存储过程中使用的所有查询进行自动跟踪,然后根据查询执行的频率估算过程成本。
除此之外,我想建议优化我的存储过程,尤其是下面给出的查询 程序逻辑:
下面是在我的存储过程中用作游标的动态sql查询。此游标在循环内打开并获取。我获取信息并将它们放入varray中,计算数据然后将其插入表中 我的目标是找出proc的成本以及优化sp。

SELECT DISTINCT acct_no    
FROM raw
WHERE 1=1
AND code = ''' || code ||
''' AND qty       < 0  
AND acct_no 
IN (SELECT acct_no FROM ' || table_name || ' WHERE counter = 
(SELECT MAX(counter) FROM ' || table_name || '))

3 个答案:

答案 0 :(得分:5)

分析SQL和PLSQL性能的最佳工具之一是本机SQL trace

  1. 在会话中启用跟踪:

    SQL> alter session set SQL_TRACE=TRUE;
    
    Session altered
    
  2. 运行您的程序

  3. 退出会话

  4. 导航到您的服务器udump目录并找到您的跟踪文件(通常是最新的)

  5. Run tkprof

  6. 这将生成一个文件,其中包含所有包含大量信息的语句列表,包括每个语句的执行次数,查询计划和统计信息。这比为每个选择手动运行计划更加详细和精确。

    如果要优化过程的性能,通常会将跟踪文件按执行时间(使用sort=EXEELA)或获取SQL进行排序,并尝试优化最有效的查询。 / p>

    您还可以在步骤1使用following command来创建跟踪文件日志等待事件:

    ALTER SESSION SET EVENTS '10046 trace name context forever, level 8';
    

答案 1 :(得分:4)

找出存储过程的成本(执行时间)的方法是使用分析器。 11g推出了高度整洁的Hierarchical Profiler。 Find out more

在11g之前只有DBMS_PROFILER,这已经足够了,特别是如果你的存储过程不使用其他模式中的对象。 Find out more

Trace有助于识别性能不佳的SQL。分析器有助于识别存储过程的PL / SQL元素的成本。如果你的proc有一些昂贵的计算元素,这些元素不能读取或写入表格,那么它们就不会出现在SQL跟踪中。

同样,如果你有一个经过良好调整的SQL语句但是使用它很糟糕,那么分析器运行可能比跟踪更有帮助。我的意思的一个例子是在Cursor循环中重复执行相同的SELECT语句:我知道这不是你正在做的但是它足够接近。


显然,分层探查器DBMS_HPROF默认安装在11g中,但DBA必须为想要使用它的开发人员授予一些权限。 Find out more

要在10g(或更早版本)中安装DBMS_PROFILER,DBA必须运行此脚本:

$ORACLE_HOME/rdbms/admin/proftab.sql

确保获得报告基础架构:

$ORACLE_HOME/plsql/demo/profsum.sql

(此脚本的名称或位置可能在早期版本中有所不同)。

答案 2 :(得分:1)

简单的方法是执行该过程,然后查询v $ sql。 如果你想要一个小小的提示,让你的生活更轻松(不只是为了包)在程序内的查询中添加一个空白的注释,如

select /* BIG DADDY */ * from dual;

然后按如下方式查询v $ sql

select * from v$sql where sql_text like '%BIG DADDY%';

最好的方式绝对是@ Vincent Malgrat 建议的方式。

祝你好运。