在 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) 与它无关。