在sqlplus中运行sql语句或者pl/sql的时候如果需要统计运行的时间,只需要开启set timing on选项即可。

SQL> set timing on
SQL>
SQL> select count(*)from cat;

COUNT(*)
----------
       408

Elapsed: 00:00:00.15
如果在运行pl/sql的时候如果需要计算程序运行的时间。使用set timing on就显得力不从心了。这个时候可以考虑使用dbms_utility.get_time来得到一个时间戳,然后在程序运行之后再得到一个时间戳,两者想减就是程序的运行时间。
set serveroutput on
declare
l_start_time PLS_INTEGER;
begin
l_start_time := dbms_utility.get_time();
dbms_output.put_line('this is a test');
dbms_lock.sleep(2);  --这里我们尝试使pl/sql块停滞2秒钟
dbms_output.put_line('Elapsed time :'||(dbms_utility.get_time-l_start_time)/100);
end;
/
程序运行的结果如下。

this is a test
Elapsed time :2.01

PL/SQL procedure successfully completed.
但是如果这样计算,可能会出现负数的情况。在pl/sql程序设计这本书中,作者给出的解释是,dbms_utility_get_time得到的数字式从某一个时间点以来所经过的总的毫秒数。而这个数字很大,很可能越界,越界的时候就会从0开始重新开始计数。如果这样计算的话,很可能计算出来的结果就是一个负数了。
我们可以使用如下的pl/sql来做一个改进。
set serveroutput on
declare
c_time_gap number:=power(2,32);
l_start_time PLS_INTEGER;
begin
l_start_time := dbms_utility.get_time();
dbms_output.put_line('this is a test');
dbms_lock.sleep(2);
dbms_output.put_line('Elapsed time :'||mod(dbms_utility.get_time-l_start_time+c_time_gap,c_time_gap)/100);
end;
/
运行结果如下:

this is a test
Elapsed time :2

PL/SQL procedure successfully completed.
如果我们在程序中嵌入过多的代码去维护start_time,end_time必然会造成程序的依赖性,如果能够把计算时间的功能独立出来就好了。这样程序的运行不必完全依赖于时间计算,可以灵活的添加和删除。
这种实现在spring的AOP是根据动态代理来实现的,在pl/sql中我们可以使用package来实现。
我们的期望结果就是
begin
pro_timing.start_timer;  --程序计算起始时间
dbms_output.put_line('this is a test');  --程序业务逻辑
dbms_lock.sleep(2);  --程序业务逻辑
pro_timing.show_elapsed('test program');  --程序计算终止时间
end;
/
我们可以使用如下的package来实现。

create or replace package pro_timing
authid current_user
is
  procedure start_timer;
  procedure show_elapsed(program_name in varchar2);
end;
/

create or replace package body pro_timing
is
c_time_gap number:=power(2,32);
l_start_time PLS_INTEGER;
procedure start_timer
is
begin
l_start_time := dbms_utility.get_time();
end;

procedure show_elapsed(program_name in varchar2)
as
l_end_time varchar2(100);
begin
l_end_time:=mod(dbms_utility.get_time-l_start_time+c_time_gap,c_time_gap)/100;
dbms_output.put_line(program_name||' has elapsed time '||l_end_time||' s.');
end;
end;
/
我们来尝试运行如下的pl/sql块。
begin
pro_timing.start_timer;
dbms_output.put_line('this is a test');
dbms_lock.sleep(2);
pro_timing.show_elapsed('test program');
end;
/
运行结果如下:

this is a test
test program has elapsed time 2 s.

PL/SQL procedure successfully completed.
这样就基本达到了我们的目标。我们可以在程序中灵活的配置这项功能,对于提升程序的性能来说也是功不可没。

通过pl/sql计算程序的运行时间的更多相关文章

  1. Oracle+PL+SQL从入门到精通.丁士锋.清华大学出版社.2012

    \t第1篇 pl/sql开发入门第1章 oracle 11g数据库系统1.1 关系型数据库系统介绍1.1.1 什么是关系型数据模型1.1.2 数据库系统范式1.1.3 关系型数据库管理系统1.1.4 ...

  2. 利用pl/sql执行计划评估SQL语句的性能简析

    一段SQL代码写好以后,可以通过查看SQL的执行计划,初步预测该SQL在运行时的性能好坏,尤其是在发现某个SQL语句的效率较差时,我们可以通过查看执行计划,分析出该SQL代码的问题所在.  那么,作为 ...

  3. PL/SQL Job

    1. 鼠标右键点击 jobs 弹出 Create Job 对话框,如下图: 2. 在对话框中输入相应的值,如下图: 其中: What                   ——作业执行时将要调用的存储过 ...

  4. 解决PL/SQL Developer连接数据库时出现 “ORA-12541:TNS:无监听程序”错误

    在用PL/SQL Developer连接数据库时出现“ORA-12541:TNS:无监听程序”错误. 1.检查listener.log日志发现下面错误:TNSLSNR for 32-bit Windo ...

  5. 百倍性能的PL/SQL优化案例(r11笔记第13天)

    我相信你是被百倍性能的字样吸引了,不过我所想侧重的是优化的思路,这个比优化技巧更重要,而结果嘛,其实我不希望说成是百倍提升,“”自黑“”一下. 有一个真实想法和大家讨论一下,就是一个SQL语句如果原本 ...

  6. Oracle PL/SQL随堂笔记总结

    1.pl/sql编程 2.存储过程 3.函数 4.触发器 5.包 6.pl/sql基础 -定义并使用变量 7.pl/sql的进阶 8.oracle的视图 1.pl/sql编程 1.理解oracle的p ...

  7. Oracle学习笔记十 使用PL/SQL

    PL/SQL 简介 PL/SQL 是过程语言(Procedural Language)与结构化查询语言(SQL)结合而成的编程语言,是对 SQL 的扩展,它支持多种数据类型,如大对象和集合类型,可使用 ...

  8. PL/SQL连接错误:ora-12705:cannot access NLS data files or invalid environment specified

    适合自己的解决方法: 排查问题: 1. 你没有安装Oracle Client软件.这是使用PL/SQL Developer的必须条件.安装Oracle Client后再重试.2. 你安装了多个Orac ...

  9. PL/SQL循环

    1.if循环做判断 SET SERVEROUTPUT ON accept num prompt 'qinshuu'; DECLARE pnum NUMBER :=& num ; BEGIN T ...

随机推荐

  1. linux磁盘占用跟每个文件夹大小总和不符

    1.一种情况是删除了大文件但是没有释放出来,因为有进程还在调用使用 最简单的方法是reboot下服务器再对比下: 2.查看服务器空间使用情况 df -h cd / du -sh *

  2. php各个版本的区别

    一. PHP 5.2.5.3.5.4.5.5.5.6 版本区别对比以及新功能详解 PHP5.2 以前:autoload, PDO 和 MySQLi, 类型约束 PHP5.2:JSON 支持 PHP5. ...

  3. P2737 [USACO4.1]麦香牛块Beef McNuggets(完全背包+数论确定上界)

    题目链接:https://www.luogu.org/problem/show?pid=2737 题目大意:农夫布朗的奶牛们正在进行斗争,因为它们听说麦当劳正在考虑引进一种新产品:麦香牛块.奶牛们正在 ...

  4. QT中循环显示图片和简单的显示图片

    请关注我的github https://github.com/linqiaozhou 以下实例代码不久后将会上传到我的github 这是我最近一个项目中的部分代码 //以下是简单的在QT中显示图片的代 ...

  5. 【hdoj_2082】找单词

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=2082 此题采用母函数的知识求解,套用母函数模板即可: http://blog.csdn.NET/ten_s ...

  6. git reset用法

    git 删除 错误 提交的 commit 方法:         根据–soft –mixed –hard,会对working tree和index和HEAD进行重置:    git reset -- ...

  7. 寻找与网页内容相关的图片(三)网易新闻与qq空间的做法

    寻找与网页相关的图片现在看来无非有两种方式,第一种是网页自己指定,第二种是通过算法推断. 对于网站的内容提供者来说,他自己知道相关的图片在哪,正如前文所述可以在HTML的头部加上META标签,也可以像 ...

  8. 图片上传功能(EasyUI前台框架+SSM框架)

    文件上传步骤: * 1.采用文件正确的接收方式(修改3处配置文件/接口类型等) * 2.判断是否为一个图片,0表示无异常,1代表异常(jpg|gif|png) * 3.判断是不是一个“正经”的图片,判 ...

  9. 京东前端:PhantomJS 和NodeJS在网站前端监控平台的最佳实践

    1. 为什么需要一个前端监控系统 通常在一个大型的 Web 项目中有很多监控系统,比如后端的服务 API 监控,接口存活.调用.延迟等监控,这些一般都用来监控后台接口数据层面的信息.而且对于大型网站系 ...

  10. 在ns2.35中添加myevalvid框架

    在用ns2进行网络视频通信仿真的时候,先要为我们自己的ns2添加evalvid或者myevalvid框架.其中myevalvid框架是由柯志亨老师整合evalvid和ns2之后得出的新框架,笔者建议大 ...