Oracle DBMS_UTILITY.GET_TIME與DBMS_UTILITY.GET_CPU_TIME區別,dbmsutility
DBMS_UTILITY.GET_TIME與DBMS_UTILITY.GET_CPU_TIME比較
原文連結:http://www.oracle-developer.net/display.php?id=307
一直以來開發人員都熟悉DBMS_UTILITY.GET_TIME函數。常用語測試一個程式中2個時間點的間隔,即程式耗時。
到了10g,oracle又增加一個DBMS_UTILITY.GET_CPU_TIME函數。這個新函數用於測量2個時間點使用的CPU時間。
下面咱們通過例子證明以下2個函數的區別:
例1:一個計算密集(cpu-bound)型例子
這個例子沒有I/O。這一點強調了CPU密集操作,這種情況下GET_TIME和GET_CPU_TIME函數將返回幾乎一致的耗時。
DECLARE b1 PLS_INTEGER; b2 PLS_INTEGER; e1 PLS_INTEGER; e2 PLS_INTEGER; n PLS_INTEGER := 0; BEGIN b1 := DBMS_UTILITY.GET_TIME(); b2 := DBMS_UTILITY.GET_CPU_TIME(); FOR i IN 1 .. 100000000 LOOP --NULL; n := n + 1; END LOOP; e1 := DBMS_UTILITY.GET_TIME() - b1; e2 := DBMS_UTILITY.GET_CPU_TIME() - b2; DBMS_OUTPUT.PUT_LINE( 'GET_TIME elapsed = ' || e1 || ' hsecs.' ); DBMS_OUTPUT.PUT_LINE( 'GET_CPU_TIME elapsed = ' || e2 || ' hsecs.' ); END;
GET_TIME elapsed = 175 hsecs.
GET_CPU_TIME elapsed = 174 hsecs.
PL/SQL 過程已成功完成。
例2:I/O密集(I/O-bound)型例子
這個例子對於PLSQL程式來講更具有代表性。這種情況下我們會看到2個函數耗時將截然不同。
DECLARE b1 PLS_INTEGER; b2 PLS_INTEGER; e1 PLS_INTEGER; e2 PLS_INTEGER;BEGIN b1 := DBMS_UTILITY.GET_TIME(); b2 := DBMS_UTILITY.GET_CPU_TIME(); FOR r IN ( SELECT * FROM all_source ) LOOP NULL; END LOOP; e1 := DBMS_UTILITY.GET_TIME() - b1; e2 := DBMS_UTILITY.GET_CPU_TIME() - b2; DBMS_OUTPUT.PUT_LINE( 'GET_TIME elapsed = ' || e1 || ' hsecs.' ); DBMS_OUTPUT.PUT_LINE( 'GET_CPU_TIME elapsed = ' || e2 || ' hsecs.' );END;/
GET_TIME elapsed = 324 hsecs.
GET_CPU_TIME elapsed = 273 hsecs.
PL/SQL 過程已成功完成。
-------------------------------------------
Dylan Presents.