Performance 如何分析Oracle存储过程的端到端性能

Performance 如何分析Oracle存储过程的端到端性能,performance,oracle,stored-procedures,plsql,oracle10g,Performance,Oracle,Stored Procedures,Plsql,Oracle10g,我想知道从外部进程访问数据库并说执行这个到数据库返回到进程并说开始执行,我的存储过程执行需要多长时间 有没有一种简单易行的方法来完成这项非常基本的任务 当然,报告存储过程执行过程中发生的事情以及存储过程执行每个任务(插入、plsql字符串操作等)所花费的时间是一个额外的好处,但我真的只想要一些简单易用的东西。(免费)如果您使用的是Oracle 11g,您应该看看层次分析工具DBMS_HPROF。这是一个为PL/SQL程序中的所有节点提供运行时间的工具。顾名思义,它特别适用于调查调用程序的程序。它

我想知道从外部进程访问数据库并说执行这个到数据库返回到进程并说开始执行,我的存储过程执行需要多长时间

有没有一种简单易行的方法来完成这项非常基本的任务


当然,报告存储过程执行过程中发生的事情以及存储过程执行每个任务(插入、plsql字符串操作等)所花费的时间是一个额外的好处,但我真的只想要一些简单易用的东西。(免费)

如果您使用的是Oracle 11g,您应该看看层次分析工具DBMS_HPROF。这是一个为PL/SQL程序中的所有节点提供运行时间的工具。顾名思义,它特别适用于调查调用程序的程序。它还标识不同于函数调用的SQL语句的计时

它是标准11g部署的一部分,因此是免费的。好吧,一旦你支付了许可证的费用,它是免费的:)

默认情况下,DBMS_HPROF包上的权限不会授予任何人。所以,你需要找一个有SYSDBA访问权限的人来看你。分析还需要创建一些表。这两件事都不应该成为问题,但我知道有时它们会成为问题


唉,你在上一个版本。这就只剩下DBMS_PROFILER了,它从9i开始就存在了。这基本上适用于单个程序。它的主要缺点是,我们只能在我们有创建权限的程序上使用它(即,除非我们有创建任何过程权限,这通常意味着作为DBA),否则只能在模式中的程序上使用它。此外,为了分析嵌入式SQL语句,我们需要使用DBMS_跟踪包

最简单、最便宜的选择 您可以将事件记录到“debug”表中,并检查日志之间的持续时间,如ex。 在将时间戳a插入到调试表之前记录事件。 将插入表a后的事件(时间戳为b)记录到调试表中


如果存储过程的长度超过5行,这会有点费时,但它仍然会对您有所帮助。还实现一个调试标志,因此当需要记录时间戳时,将过程顶部的标志设置为true,然后重新编译它。执行存储过程时,它会记录您的所有事件,完成调试后,将标志设置为false并重新编译。

如果您希望将自己的时间间隔写入PL/SQL程序,下面是我的模板代码。此外,这不需要DBA的帮助。我的DBA通常不愿意让我有更多的机会接触更多的东西。我讨厌等待他们真正给我访问权

/* This procedure is simply an example of parsing out an Elapsed time into their individual time parts */
/*   In other words it provides to the user the elapsed time in hours : minutes : seconds . milliseconds */

DECLARE

  G_START_TIME1     NUMBER        := DBMS_UTILITY.GET_TIME;
  G_START_TIME2     NUMBER        := DBMS_UTILITY.GET_TIME;
  vG_ELAPSED_TIME   VARCHAR2(200);

  /* Variables below are used for storing Elapsed time. */
  RETVAL           NUMBER;
  hourss            NUMBER;
  minutess          NUMBER;
  secondss          NUMBER;
  millisecondss     NUMBER;
    n_hrs         NUMBER := 360000;
    n_mins        NUMBER := 6000;
    n_secs        NUMBER := 100;
    n_sixty       NUMBER := 60;
    n_thirty      NUMBER := 30;
    n_ten         NUMBER := 10;

  v_PrintTime     VARCHAR2(200);


  /* The procedure below is simply used to simulate the passage of time */
  PROCEDURE waste_time(pn_Seconds NUMBER) IS

  n_CentiSeconds  NUMBER  :=  pn_Seconds * 100;
  n_ProgramStart  NUMBER  := DBMS_UTILITY.GET_TIME; /* dbms_utility_get_time returns times in hundreds of a second */

  BEGIN
    WHILE DBMS_UTILITY.GET_TIME < n_ProgramStart + n_CentiSeconds
    LOOP
      null;
    END LOOP;
  END waste_time;

BEGIN

  G_START_TIME1   :=    -2019618227; --dbms_utility.get_time;

  --waste_time(1);
  --dbms_output.put_line('1 Second Wasted'|| chr(10));

  G_START_TIME2   :=    G_START_TIME1 + 366110; ---2019619227; --dbms_utility.get_time;

  dbms_output.put_line('Start_time: '||G_START_TIME1);
  dbms_output.put_line('End_time:   '||G_START_TIME2||chr(10));

  vG_ELAPSED_TIME :=  G_START_TIME2 - G_START_TIME1;
  millisecondss   :=  vG_ELAPSED_TIME * n_ten;
  secondss        :=  vG_ELAPSED_TIME / n_secs;
  minutess        :=  vG_ELAPSED_TIME / n_mins;
  hourss          :=  vG_ELAPSED_TIME / n_hrs;

  dbms_output.put_line('Total Time: '||millisecondss ||' Milliseconds');
  dbms_output.put_line('Total Time: '||vG_ELAPSED_TIME ||' Centiseconds');
  dbms_output.put_line('Total Time: '||secondss ||' Seconds');
  dbms_output.put_line('Total Time: '||minutess ||' Minutes');
  dbms_output.put_line('Total Time: '||hourss ||' Hours');

  millisecondss   :=  mod(vG_ELAPSED_TIME * n_ten, 1000);            /* Milliseconds into Seconds.  Returns left over millisedonds */
  secondss        :=  trunc(mod(vG_ELAPSED_TIME / n_secs, n_sixty)); /* Seconds into hours.  Returns how many seconds are left over */
  minutess        :=  trunc(mod(vG_ELAPSED_TIME / n_mins, n_sixty)); /* Seconds into hours.  Returns how many seconds are left over */
  hourss          :=  trunc(vG_ELAPSED_TIME / n_hrs);                /* Spit out hours only using just trunc here.  Since we don't need to build up Days we can leave this as is */

  v_PrintTime     :=  hourss ||':'|| minutess ||':'|| secondss ||'.'|| millisecondss;

  dbms_output.put_line(chr(10) ||'Elapsed Time: '|| v_PrintTime);


END;
/*此过程只是将经过的时间解析为各自时间部分的一个示例*/
/*换句话说,它向用户提供以小时:分钟:秒为单位的经过时间。毫秒*/
声明
G_START_TIME1 NUMBER:=DBMS_UTILITY.GET_TIME;
G_START_TIME2 NUMBER:=DBMS_UTILITY.GET_TIME;
vG_运行时间VARCHAR2(200);
/*下面的变量用于存储经过的时间*/
检索号;
小时数;
分钟数;
秒数;
毫秒数;
n_小时数:=360000;
n_分钟数:=6000;
n_秒数:=100;
n_六十个数:=60;
n_三十个数:=30;
n_十个数:=10;
v_PrintTime VARCHAR2(200);
/*下面的过程只是用来模拟时间的流逝*/
程序浪费时间(pn秒数)为
n_厘米秒数:=pn_秒*100;
n_程序开始编号:=DBMS_实用程序.GET_时间;/*dbms_实用程序_get_time返回的时间以每秒数百次为单位*/
开始
而DBMS_UTILITY.GET_TIME
您考虑过该网站吗?这与编程无关(不管怎么说,它的措辞可能是我遗漏了什么。)@Mat-完全不同意。分析程序的性能是很重要的