在SELECT ... INTO ...
语句中,是否可以在Oracle11g中分析在plsql代码中调用的存储函数?
对于性能分析,我使用DBMS_HPROF
实用程序。在DBMSHP_FUNCTION_INFO
表中运行分析之后,我可以看到除了在SELECT ... INTO ...
中调用的函数之外的所有内容。
发布于 2015-08-10 23:21:16
在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)与它无关。
发布于 2015-08-13 16:50:05
我在DBMSHP_FUNCTION_INFO中看到了除sql函数之外的所有函数,因为Dbms_hprof没有跟踪sql函数(如ln、nvl和nvl)。等等)。
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次。
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
发布于 2015-08-12 02:43:53
您有没有尝试在存储函数中启用分析器?这可能会创建单独的跟踪(不同的runId )。
https://stackoverflow.com/questions/31607705
复制相似问题