通过pl/sql计算程序的运行时间

简介: 在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的时候如果需要计算程序运行的时间。

在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.

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

目录
相关文章
|
5月前
|
SQL 存储 大数据
Dataphin V5.0:支持创建异步调用API,实现慢 SQL 复杂计算的直连消费
本文介绍了数据服务产品中异步调用的应用场景与优势,包括大数据引擎查询、复杂SQL及大规模数据下载等场景,解决了同步调用可能导致的资源浪费和性能问题。通过创建异步API、测试发布以及权限申请等功能,实现高效稳定的服务提供。以电商订单查询为例,展示了如何利用异步调用提升系统性能与用户体验。
191 9
|
5月前
|
存储 SQL 数据库连接
C#程序调用Sql Server存储过程异常处理:调用存储过程后不返回、不抛异常的解决方案
本文分析了C#程序操作Sql Server数据库时偶发的不返回、不抛异常问题,并提出了解决思路。首先解析了一个执行存储过程的函数`ExecuteProcedure`,其功能是调用存储过程并返回影响行数。针对代码执行被阻塞但无异常的情况,文章总结了可能原因,如死锁、无限循环或网络问题等。随后提供了多种解决方案:1) 增加日志定位问题;2) 使用异步操作提升响应性;3) 设置超时机制避免阻塞;4) 利用线程池分离主线程;5) 通过信号量同步线程;6) 监控数据库连接状态确保可用性。这些方法可有效应对数据库操作中的潜在问题,保障程序稳定性。
417 11
|
11月前
|
SQL 数据采集 监控
局域网监控电脑屏幕软件:PL/SQL 实现的数据库关联监控
在当今网络环境中,基于PL/SQL的局域网监控系统对于企业和机构的信息安全至关重要。该系统包括屏幕数据采集、数据处理与分析、数据库关联与存储三个核心模块,能够提供全面而准确的监控信息,帮助管理者有效监督局域网内的电脑使用情况。
148 2
|
SQL 安全 网络安全
SQL安装程序规则错误解决方案
在安装SQL Server时,遇到安装程序规则错误是一个比较常见的问题
|
SQL 存储 缓存
SQL计算班级语文平均分:详细步骤与技巧
在数据库管理和分析中,经常需要计算某个班级在特定科目上的平均分
|
SQL 安全 Windows
SQL安装程序规则错误解析与解决方案
在安装SQL Server时,用户可能会遇到安装程序规则错误的问题,这些错误通常与系统配置、权限设置、依赖项缺失或版本不兼容等因素有关
|
SQL 存储 并行计算
Lindorm Ganos 一条 SQL 计算轨迹
Lindorm Ganos 针对轨迹距离计算场景提供了内置函数 ST_Length_Rows,结合原生时空二级索引和时空聚合计算下推技术,能够高效过滤数据并并行执行运算任务。该方案通过主键索引和时空索引快速过滤数据,并利用多Region并行计算轨迹点距离,适用于车联网等场景。具体步骤包括根据车辆识别代码和时间戳过滤数据、范围过滤轨迹点以及并行计算距离。使用限制包括只支持点类型列聚合运算及表中轨迹点需按顺序排列等。测试结果显示,Lindorm Ganos 在不同数据量下均能实现秒级响应。
121 3
|
SQL Oracle 关系型数据库
SQL与PL/SQL:数据库编程语言的比较
【8月更文挑战第31天】
409 1
|
SQL 数据挖掘 数据库
SQL计算班级语文平均分:详细步骤与技巧
在数据库管理中,经常需要统计和查询各种汇总信息,如班级某科目的平均分
|
SQL 分布式计算 大数据
MaxCompute产品使用问题之odps sql 底层计算框架是MR吗
MaxCompute作为一款全面的大数据处理平台,广泛应用于各类大数据分析、数据挖掘、BI及机器学习场景。掌握其核心功能、熟练操作流程、遵循最佳实践,可以帮助用户高效、安全地管理和利用海量数据。以下是一个关于MaxCompute产品使用的合集,涵盖了其核心功能、应用场景、操作流程以及最佳实践等内容。
139 1

热门文章

最新文章