暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle pl/sql代码调试-长时间运行块

askTom 2017-03-28
380

问题描述

嗨-我们的开发人员有一个程序包,他们正在开始运行...端块。他们告诉我们,这个街区似乎运行了很长时间。这是唯一在数据库中运行并使用超过90% cpu的东西。我们运行了AWR和ASH报告,但他们只告诉我们这个街区是我们已经知道的最重要的事件。我们希望获得更多信息,因为包中的哪一行正在运行很长时间。有办法获取这些信息吗?

谢谢。

专家解答

一个攻击计划可能是

a) 查看v $ session.sql_id-查看它运行的确切SQL
b) 查询v $ sql的sql_id,它将向您显示它起源于块中的位置。

我博客上的一个完整例子

https://connormcdonald.wordpress.com/2016/01/20/problematic-sql-plsql-is-your-friend/

或者,获取包并向dbms_application_info添加一些调用,例如

SQL> create or replace
  2  procedure P is
  3  begin
  4    dbms_application_info.set_action('Start');
  5
  6    -- simulate a 5 second activity
  7    dbms_lock.sleep(5);
  8
  9    dbms_application_info.set_action('Step 2');
 10
 11    -- simulate a 5 second activity
 12    dbms_lock.sleep(5);
 13
 14    dbms_application_info.set_action('Step 2');
 15
 16    -- simulate a 5 second activity
 17    dbms_lock.sleep(5);
 18
 19    dbms_application_info.set_action('Step 2');
 20
 21    -- simulate a 5 second activity
 22    dbms_lock.sleep(5);
 23  end;
 24  /

Procedure created.

SQL>
SQL> exec P
[running]

--
-- then from another session I can see its status
--
SQL> select action
  2  from   v$session
  3  where  status = 'ACTIVE'
  4  and    username = 'MCDONAC';

ACTION
-------------------------------------------------


SQL>
SQL> /

ACTION
-------------------------------------------------

Start

SQL> /

ACTION
-------------------------------------------------

Step 2

SQL> /

ACTION
-------------------------------------------------

Step 3



dbms_application_info对事务没有影响,而且速度非常快

SQL> set timing on
SQL> begin
  2  for i in 1 .. 1000000 loop
  3    dbms_application_info.set_action('Step 2');
  4  end loop;
  5  end;
  6  /

PL/SQL procedure successfully completed.

Elapsed: 00:00:01.02


所以我的笔记本电脑每秒大约1,000,000个电话
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论