首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在过程中找到引用游标执行时间?

如何在过程中找到引用游标执行时间?
EN

Stack Overflow用户
提问于 2018-03-27 07:31:51
回答 3查看 1.4K关注 0票数 0

我使用参考游标作为PLSQL过程的输出参数。我需要在日志表中维护proc的准确开始和结束时间。

下面的虚拟代码:

代码语言:javascript
复制
Procedure(P1 IN NUMBER, P_REF_CUR OUT SYS_REFCURSOR)
IS
V_TS TIMESTAMP;
BEGIN
V_TS := SYSTIMESTAMP;
<Business logic here to generate SELECT query for Ref Cursor...>;

OPEN P_REF_CUR FOR <SELECT QUERY>;

INSERT INTO LOG_TABLE(ID, STR_TIME,END_TIME,..) VALUES 
(1,V_TS,SYSTIMESTAMP,...);
END;

对参考游标的select查询有时需要2-3分钟才能执行,但在日志表中,我发现STR_TIME和END_TIME之间的区别仅为几秒钟。

如何捕获过程所需的总时间,包括查询执行时间?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-03-27 08:21:53

从程序内部看不出来。 statement

..。将游标变量与查询关联,分配数据库资源以处理查询,标识结果集,并将游标放置在结果集的第一行之前。

在您的过程中,您所能做的就是生成查询文本所需的时间和打开游标所需的时间。然后,该过程结束,调用方接管OUT ref游标。从这里你看不到光标会发生什么变化。

调用者比(想必)获取数据,这占用了大量时间;但也可能正在进行其他处理。您需要调用者记录调用过程与结束引用游标之间的时间--但这仍然包括它所做的任何额外处理,因此您无法从游标查询处理和抓取中分离出实际有多少。

如果这足够接近,那么您可能会有第二个过程关闭游标并记录时间,如果您不希望调用方不得不担心它。您可以让“open”游标记录会话变量中的开始时间(使包有状态),并让“close”过程检索该过程并插入日志记录;或者让“open”以空结束时间将初始插入执行到日志表中,然后使用实际结束时间进行“关闭”更新该记录。但再说一次,它只是近似的。

如果您真的想在该过程中完成所有操作,那么您必须在其中执行所有的查询处理,这可能意味着将游标大容量收集到集合中,并使用该集合类型作为OUT参数,从而调整调用方来迭代该集合,而不是游标。当然,这也有更多的内存开销,因此可能不切实际。

票数 0
EN

Stack Overflow用户

发布于 2018-03-27 08:00:18

您可以尝试将此过程分为两个打包过程,并应用set timing on

代码语言:javascript
复制
SQL> create or replace package myPkg is
        procedure pr1(P1 IN NUMBER);
        procedure pr2(P_REF_CUR OUT SYS_REFCURSOR);
end;
/

SQL> create or replace package body myPkg is
    v_ts  timestamp;
  procedure pr1(P1 IN NUMBER) is
  begin
    v_ts := SYSTIMESTAMP;
    <Business logic here to generate SELECT query for Ref Cursor...>;  
  end;

  procedure pr2(P_REF_CUR OUT SYS_REFCURSOR) is
  begin
    open P_REF_CUR for <SELECT QUERY>;
    insert into log_table(ID, STR_TIME,END_TIME,..) values(1,V_TS,SYSTIMESTAMP,...);  
  end;  
end;
/

SQL> set timing on;
SQL> var v_p1 number:=107;
SQL> var v_rc refcursor;
SQL> exec myPkg.pr1( :v_p1 );

PL/SQL procedure successfully completed

Executed in 152,25 seconds

SQL> exec myPkg.pr2( :v_rc );

PL/SQL procedure successfully completed

Executed in 12,34 seconds

SQL> print v_rc;
票数 1
EN

Stack Overflow用户

发布于 2018-03-27 08:18:03

一旦您的过程将引用游标返回到调用进程,它就无法知道它会发生什么。调用者甚至可能永远不会从游标中获取所有行。这是由调用者记录下接下来发生的事情。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49506845

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档