lunes, 10 de septiembre de 2007

Cantidad de CPU utilizada en un procedimiento

Todos conocemos la función DBMS_UTILITY.GET_TIME() que se utiliza para tomar el tiempo entre dos puntos de un determinado proceso. Esta función es muy utilizada por los desarrolladores. La verdad es que no conozco un sólo desarrollador que jamás haya usado ésta función.
En 10g, Oracle agrega una nueva función, DBMS_UTILITY.GET_CPU_TIME() que sirve para saber la cantidad de CPU que es utilizada entre dos puntos de un determinado proceso.

En nuestro primer ejemplo vamos a ver la utilización de éstas 2 funciones sin acceder a disco, y luego, vamos a acceder a disco y vamos a ver la diferencia que se genera tanto en tiempo de CPU como de procesamiento:

Ejemplo SIN I/0 a disco:

SQL_10gR1> DECLARE
2
3 l_inicio_1 PLS_INTEGER ;
4 l_inicio_2 PLS_INTEGER ;
5 l_fin_1 PLS_INTEGER ;
6 l_fin_2 PLS_INTEGER ;
7
8 BEGIN
9
10 l_inicio_1 := DBMS_UTILITY.GET_TIME() ;
11 l_inicio_2 := DBMS_UTILITY.GET_CPU_TIME() ;
12
13 FOR i IN 1 .. 99999999 LOOP
14 NULL ;
15 END LOOP ;

16
17 l_fin_1 := DBMS_UTILITY.GET_TIME() - l_inicio_1 ;
18 l_fin_2 := DBMS_UTILITY.GET_CPU_TIME() - l_inicio_2 ;
19
20 DBMS_OUTPUT.PUT_LINE( 'GET_TIME = ' || l_fin_1 || ' hsecs.' ) ;
21 DBMS_OUTPUT.PUT_LINE( 'GET_CPU_TIME = ' || l_fin_2 || ' hsecs.' ) ;
22
23 END ;
24 /

GET_TIME = 1820 hsecs.
GET_CPU_TIME = 1692 hsecs.


PL/SQL procedure successfully completed.

Ejemplo CON I/0 a disco:

SQL_10gR1> CREATE TABLE test AS
2 SELECT level id
3 FROM dual
4 CONNECT BY level <= 10000000 ;

Table created.

SQL_10gR1> EXEC DBMS_STATS.GATHER_TABLE_STATS(USER, 'TEST') ;

PL/SQL procedure successfully completed.


SQL_10gR1> DECLARE
2
3 l_inicio_1 PLS_INTEGER ;
4 l_inicio_2 PLS_INTEGER ;
5 l_fin_1 PLS_INTEGER ;
6 l_fin_2 PLS_INTEGER ;
7
8 BEGIN
9
10 l_inicio_1 := DBMS_UTILITY.GET_TIME() ;
11 l_inicio_2 := DBMS_UTILITY.GET_CPU_TIME() ;
12
13 FOR i IN ( SELECT * FROM test ) LOOP
14 NULL ;
15 END LOOP ;

16
17 l_fin_1 := DBMS_UTILITY.GET_TIME() - l_inicio_1 ;
18 l_fin_2 := DBMS_UTILITY.GET_CPU_TIME() - l_inicio_2 ;
19
20 DBMS_OUTPUT.PUT_LINE( 'GET_TIME = ' || l_fin_1 || ' hsecs.' ) ;
21 DBMS_OUTPUT.PUT_LINE( 'GET_CPU_TIME = ' || l_fin_2 || ' hsecs.' ) ;
22
23 END ;
24 /

GET_TIME = 7884 hsecs.
GET_CPU_TIME = 7741 hsecs.


PL/SQL procedure successfully completed.

1 comentario:

Javier dijo...

Buenos días Leonardo,

Quisiera saber que estrategia mediante PL/SQL puedo utilizar para que dada una cadena de texto busque en otra tabla la mas parecida a la cadena recibida.

Salu2,

Javier Rey