在Oracle中分析存储的函数

Vol*_*lov 6 oracle profiling plsql oracle11g

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

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

Mat*_*eak 3

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

SELECT my_pkg.my_func(x) INTO y FROM dual;
Run Code Online (Sandbox Code Playgroud)

现在,我看不到每一行——通常只能看到 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;
Run Code Online (Sandbox Code Playgroud)

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

SELECT SUM(column_value) INTO x FROM TABLE(t); 
Run Code Online (Sandbox Code Playgroud)

但不是,例如,

x := ln (x+i);
Run Code Online (Sandbox Code Playgroud)

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

FUNCTION p (a NUMBER)
Run Code Online (Sandbox Code Playgroud)

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

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