在Oracle11g中是否可以分析从SELECT ... INTO ...
语句中的plsql代码中调用的存储函数?
对于分析,我使用DBMS_HPROF
实用程序。在DBMSHP_FUNCTION_INFO
表中运行分析后,我可以看到除SELECT ... INTO ...
中调用的函数之外的所有内容。
答案 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)。