透過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.
這樣就基本達到了我們的目標。我們可以在程式中靈活的配置這項功能,對於提升程式的效能來說也是功不可沒。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/8494287/viewspace-1405529/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 通過pl/sql計算程式的執行時間SQL
- 計算SQL執行時間SQL
- 計算php程式執行時間的程式PHP
- Stopwatch 計算程式執行時間
- python程式計算執行時間差Python
- lr計算程式執行消耗時間的比較:
- JavaScript 計算程式碼執行花費時間JavaScript
- Java專案計算程式執行時間方法Java
- 透過查詢檢視sql執行計劃SQL
- C++可以用的計算程式執行時間的方法C++
- 透過空間佔用和執行計劃瞭解SQL Server的行儲存索引SQLServer索引
- linux系統時間程式設計(9) 計算程式片段執行時間clock函式Linux程式設計函式
- python用time函式計算程式執行時間Python函式
- matlab中三種計算程式執行時間方法Matlab
- 關於laravel計算程式執行時間的優雅寫法Laravel
- 使用PL/SQL檢視執行計劃SQL
- SQL效能的度量 - 透過v$sql_plan查詢執行計劃SQL
- PL/SQL執行動態SQLSQL
- 計算頁面執行時間的兩種方法
- pl/sql developer 分析的執行計劃不可信SQLDeveloper
- 如何計算一段js程式碼執行耗費的時間JS
- js如何計算一段程式碼的執行花費時間JS
- oracle查詢sql執行耗時、執行時間、sql_idOracleSQL
- C# 程式找出檔案重複的行,計算函式執行的時間C#函式
- 透過分析SQL語句的執行計劃最佳化SQL(總結)SQL
- MyBatis列印SQL執行時間MyBatisSQL
- 執行truncate在pl/sqlSQL
- 透過執行計劃中的CONCATENATION分析sql問題SQL
- .NET程式碼樹執行時間計時器
- [轉]透過分析SQL語句的執行計劃最佳化SQL(總結)SQL
- 透過10053事件分析一個SQL執行計劃事件SQL
- JVM的特性,透過程式碼來揭秘執行時資料區JVM
- JAMon監控SQL執行時間SQL
- 調整PL/SQL程式碼加速執行(2例)SQL
- SQL Server中檢視SQL句子執行所用的時間SQLServer
- 程式執行時間的測量
- 透過SQL_ID檢視SQL歷史執行資訊SQL
- 定位rac環境中某條sql執行時間過長SQL