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

问题描述 投票:0回答:4

有人可以告诉我是否有任何方法可以找出Oracle中存储过程的成本吗?如果没有直接的方法,我想知道有什么替代品。
我发现成本的方法是自动跟踪存储过程中使用的所有查询,然后根据查询执行的频率估计过程成本。
除此之外,我想要优化我的存储过程的建议,尤其是下面给出的查询。
程序逻辑:
下面是在我的存储过程中用作游标的动态 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 || '))
performance oracle stored-procedures plsql query-optimization
4个回答
6
投票

分析 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';

4
投票

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

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

跟踪有助于识别性能不佳的 SQL。 探查器非常适合识别存储过程的 PL/SQL 元素的成本。 如果您的过程有一些昂贵的计算元素,这些元素不会读取或写入表,那么它们不会显示在 SQL 跟踪中。

同样,如果您有一个经过良好调整的 SQL 语句,但使用不当,那么分析器运行可能比跟踪更有帮助。 我的意思的一个例子是在游标循环内重复执行相同的 SELECT 语句:我知道这不完全是您正在做的事情,但它已经足够接近了。


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

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

$ORACLE_HOME/rdbms/admin/proftab.sql

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

$ORACLE_HOME/plsql/demo/profsum.sql

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


1
投票

最简单的方法是执行过程,然后查询v$sql。 如果您想要一些小技巧来让您的生活更轻松(不仅仅是包),请在过程内的查询中添加空白注释,例如

select /* BIG DADDY */ * from dual;

然后查询v$sql如下

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

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

祝你好运。


0
投票

基本上我们可以通过检查解释计划/执行计划来找到执行查询的成本,其中会提到查询的成本, 这将是找到查询成本的基础和第一步,

要查找程序的成本,我们还可以使用带有 utility_get_time 的分析器;

我们可以在哪里找到程序执行时间。

© www.soinside.com 2019 - 2024. All rights reserved.