首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在Oracle中分析存储函数

在Oracle中分析存储函数
EN

Stack Overflow用户
提问于 2015-07-24 18:06:41
回答 3查看 604关注 0票数 6

SELECT ... INTO ...语句中,是否可以在Oracle11g中分析在plsql代码中调用的存储函数?

对于性能分析,我使用DBMS_HPROF实用程序。在DBMSHP_FUNCTION_INFO表中运行分析之后,我可以看到除了在SELECT ... INTO ...中调用的函数之外的所有内容。

EN

回答 3

Stack Overflow用户

发布于 2015-08-10 23:21:16

在11g2中,我的HPROF结果包括包函数中的行,这些行被称为

代码语言:javascript
运行
复制
SELECT my_pkg.my_func(x) INTO y FROM dual;

现在,我看不到每一行--通常只看到SQL语句。例如,我在下面的包中分析了"main_test“。

代码语言:javascript
运行
复制
ALTER SESSION SET PLSQL_OPTIMIZE_LEVEL=0;

CREATE OR REPLACE PACKAGE matt_t1 AS
  FUNCTION p (a NUMBER)
    RETURN NUMBER;

  PROCEDURE main_test;
END matt_t1;

CREATE OR REPLACE  TYPE my_num_tab_type IS TABLE OF NUMBER;

CREATE OR REPLACE PACKAGE BODY matt_t1 AS
  FUNCTION p (a NUMBER)
    RETURN NUMBER IS
    x   NUMBER := 0;
    t my_num_tab_type;
   BEGIN
     t := new my_num_tab_type();
      for i in 1..10000 loop
          x := ln (x+i);
          t.extend();
         t(i) := x;
     END loop;

     SELECT SUM(column_value) INTO x FROM TABLE(t); 
    RETURN x;
  END p;

  PROCEDURE main_test IS
    x   NUMBER;
  BEGIN
    FOR i IN 1 .. 100 LOOP
      x   := matt_t1.p (i);
       DBMS_OUTPUT.put_line (x);
    END LOOP;
  END main_test;
END matt_t1;

在HPROF结果中,我看到以下条目

代码语言:javascript
运行
复制
SELECT SUM(column_value) INTO x FROM TABLE(t); 

但不是,例如,

代码语言:javascript
运行
复制
x := ln (x+i);

如果我只是通过PL/SQL直接赋值,那么无论我是否调用函数p作为SELECT INTO vs,我都会得到相同的结果。无论哪种方式,10,000个自然对数的所有时间都存储在行的HPROF条目下

代码语言:javascript
运行
复制
FUNCTION p (a NUMBER)

如果我只是直接分析对MATT_T1.P()的调用,也会得到相同的结果。

因此,我认为HPROF在它可以包含的PL/SQL行的种类方面可能有一些限制,但在我看来,调用方法(SELECT..INTO)与它无关。

票数 3
EN

Stack Overflow用户

发布于 2015-08-13 16:50:05

我在DBMSHP_FUNCTION_INFO中看到了除sql函数之外的所有函数,因为Dbms_hprof没有跟踪sql函数(如ln、nvl和nvl)。等等)。

代码语言:javascript
运行
复制
create or replace function addNum(p1 number,p2 number)  return 
as
begin 
 return p1+p2;
end;

BEGIN
  sys.DBMS_HPROF.START_PROFILING('TMP', 'test.trc');
END;
/

declare 
 n number;
 n2 number;
 n3 number;
BEGIN
  select sum(1),max(1),ln(1) into n,n2,n3 from dual;
  select max(addNum(1,level)) into n from dual connect by level<10;
END;
/

BEGIN
  DBMS_HPROF.STOP_PROFILING;
END;
/

因此,让我们进入trc文件。

select sum(1) into n from dual;被标记为P#C SQL."".""."__static_sql_exec_line6" #6,这意味着已经在第6行执行了静态sql。

这个select从第6行的P#C SQL."".""."__static_sql_exec_line7" #7开始,然后切换到plsql VM来计算addnum的结果。__plsql_vm和ADDNUM appere在trc中9次。

代码语言:javascript
运行
复制
P#C SQL."".""."__static_sql_exec_line7" #7
P#X 3338
P#C PLSQL."".""."__plsql_vm"  <--switch context
P#X 2
P#C PLSQL."ALUKASIEWICZ"."ADDNUM"::8."ADDNUM"#a7f835561d3611ed #1  <-- execut function
票数 1
EN

Stack Overflow用户

发布于 2015-08-12 02:43:53

您有没有尝试在存储函数中启用分析器?这可能会创建单独的跟踪(不同的runId )。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31607705

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档