1

任何人都可以让我知道是否有任何方法可以找出 Oracle 中存储过程的成本?如果没有直接的方法,我想知道任何替代品。
我发现成本的方法是自动跟踪存储过程中使用的所有查询,然后根据查询执行的频率估计 proc 成本。
除此之外,我想要优化我的存储过程的建议,尤其是下面给出的查询。
过程逻辑:
下面是我的存储过程中用作游标的动态 sql 查询。此游标在循环内打开并获取。我获取信息并将它们放入一个可变数组中,对数据进行计数,然后将其插入到表中。
我的目标是找出 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 || '))
4

3 回答 3

5

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

  1. 在会话中启用跟踪:

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

  3. 退出您的会话

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

  5. 运行 tkprof

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

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

您还可以在步骤 1 中使用以下命令使跟踪文件记录等待事件:

ALTER SESSION SET EVENTS '10046 trace name context forever, level 8';
于 2013-02-08T09:55:12.470 回答
4

找出存储过程的成本(执行时间)的方法是使用分析器。11g 引入了高度整洁的 Hierarchical Profiler。 了解更多

在 11g 之前,只有 DBMS_PROFILER,这已经足够好了,尤其是当您的存储过程不使用其他模式中的对象时。 了解更多

跟踪有助于识别性能不佳的 SQL。Profiler 可以很好地识别存储过程的 PL/SQL 元素的成本。如果您的 proc 有一些不读取或写入表的昂贵计算元素,那么这些元素将不会显示在 SQL 跟踪中。

同样,如果您有一个经过良好调整的 SQL 语句,但使用不当,ia profiler run 可能比跟踪更有帮助。我的意思的一个例子是在游标循环中重复执行相同的 SELECT 语句:我知道这不是你正在做的,但它已经足够接近了。


显然,分层分析器 DBMS_HPROF 默认安装在 11g 中,但 DBA 必须向想要使用它的开发人员授予一些权限。 了解更多

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

$ORACLE_HOME/rdbms/admin/proftab.sql

一定要获得报告基础设施:

$ORACLE_HOME/plsql/demo/profsum.sql

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

于 2013-02-08T11:13:09.257 回答
1

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

select /* BIG DADDY */ * from dual;

然后查询v$sql如下

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

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

祝你好运。

于 2013-02-09T22:41:01.847 回答