domingo, 31 de marzo de 2013

ORA-02393

Este ejemplo está probado en Oracle 11.2.0.2.7 y muestra come se puede limitar el tiempo de CPU de una consulta SQL. Antes de empezar, hay que verificar que RESOURCE_LIMIT sea TRUE. Si no se hace esto, Oracle no impone los límites: 

SQL> alter session set nls_language = 'SPANISH'
  2  /
 
Sesion modificada.
 

SQL> alter system set resource_limit = true
  2  /
 
Sistema modificado.
 
SQL>

Luego es necesario crear un perfil que limitará el tiempo de CPU a un segundo (el valor es suministrado en centésimas de segundo): 

SQL> create profile para_andrew
  2  limit cpu_per_call 100
  3  /
 
Perfil creado.
 
SQL>

Entonces debemos tener un usuario con este perfil:

SQL> create user andrew identified by reid
  2  profile para_andrew
  3  /
 
Usuario creado.
 
SQL> grant create session,
  2        alter session,
  3        select any dictionary to andrew
  4  /
 
Concesion terminada correctamente.
 
SQL> conn andrew/reid
Connected.
SQL> alter session set nls_language = 'SPANISH'
  2  /
 
Sesion modificada.
 
SQL>

Medimos el tiempo de CPU al principio de la manera siguiente:

SQL> select a.value/100
  2  from v$mystat a, v$sysstat b
  3  where a.statistic# = b.statistic#
  4  and b.name = 'CPU used by this session'
  5  /
 
A.VALUE/100
-----------
        .01
 
SQL>

Luego ejecutamos una consulta que empleará más de un segundo de tiempo de CPU: 

SQL> select count(*)
  2  from dba_tables a, dba_tables b
  3  /
from dba_tables a, dba_tables b
     *
ERROR en linea 2:
ORA-02393: ha excedido el limite de llamadas para uso
de CPU
 
SQL>

La consulta falla con un error ORA-02393. Entonces vemos que el tiempo de CPU de la sesión sea aproximadamente un segundo más:

SQL> select a.value/100
  2  from v$mystat a, v$sysstat b
  3  where a.statistic# = b.statistic#
  4  and b.name = 'CPU used by this session'
  5  /
 
A.VALUE/100
-----------
        1.2
 
SQL>

En inglés / in English 

No hay comentarios:

Publicar un comentario