在Oracle中分析存储的函数

时间:2015-07-24 10:06:41

标签: oracle plsql oracle11g profiling

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

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

3 个答案:

答案 0 :(得分:3)

在11g2中,我的HPROF结果包括被称为

的包函数中的行
SELECT my_pkg.my_func(x) INTO y FROM dual;

现在,我看不到每一行 - 通常只有SQL语句。例如,我描述了" main_test"在以下包中。

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结果中,我看到了

的条目
SELECT SUM(column_value) INTO x FROM TABLE(t); 

但不是,例如,

x := ln (x+i);

如果我直接通过PL / SQL分配值,我是否将函数p称为SELECT INTO vs得到相同的结果。无论哪种方式,10,000个自然对数的所有时间都在HPROF条目下划线

FUNCTION p (a NUMBER)

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

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

答案 1 :(得分:1)

我看到DBMSHP_FUNCTION_INFO中的所有函数都执行了sql函数,因为 Dbms_hprof追踪sql函数(例如ln,nvl ......等)。

select sum(1) into n from dual;

所以,让我们进入trc文件 P#C SQL."".""."__static_sql_exec_line6" #6 标记为select max(addNum(1,level)) into n from dual connect by level<10;,表示已在第6行执行静态SQL。
P#C SQL."".""."__static_sql_exec_line7" #7此选择以第{6行}中的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 开始,接下来它将自身切换到plsql VM以计算addnum的结果。 __plsql_vm和ADDNUM在trc中出现9次。

app.get('/', function(req, res){
  MongoClient.connect(dbUrl, function(err, db){
    //work with db data
  });
});

答案 2 :(得分:0)

您是否尝试在存储的函数中启用探查器?这可能会创建单独的跟踪(不同的runId)。