ORA-02395: ha excedido el límite de llamadas para uso de E/S

El ORA-02395 es un error bastante común que nos informa que la sentencia o proceso que estamos lanzando ha excedido el límite de llamas para uso de entrada/salida. Dicho de otra forma, excede el límite de llamadas autorizadas por el administrador de base de datos (DBA).

Si no eres el DBA y has recibido este error en alguna carga o proceso, tendrás que comentarle la situación y negociar con él para poder lanzar la sentencia o proceso. Aunque al final de este artículo voy a darte una sugerencia, con la que quizás puedas salvar la situación sin tener que pedir ayuda a nadie.

Si eres el DBA (o ninja de Oracle) vamos a ver cómo lo podemos solventar…

Solución al ORA-02395

Lo primero que tendremos que saber es el usuario que ha dado este problema, sabiendo eso podemos averiguar qué perfil tiene asociado:

select username, profile from dba_users where username='<NOMBRE_USUARIO>';

Conociendo el perfil, podremos ver el límite del parámetro LOGICAL_READS_PER_CALL, que es el causante del ORA-02395. Este valor especifica el número máximo permitido de bloque de datos leídos para una llamada SQL. Si superamos este valor, obtenemos el error indicado.

Con esta sentencia podemos ver el valor asignado para el perfil deseado:

select * from dba_profiles where profile='<NOMBRE_PERFIL>' and RESOURCE_NAME='LOGICAL_READS_PER_CALL';

Si decidimos ampliar el límite, tendremos que lanzar:

ALTER PROFILE <NOMBRE_PERFIL> LIMIT LOGICAL_READS_PER_CALL <LIMITED>;

También lo podemos dejar ilimitado, aunque esto significaría desactivar este filtro y, en ese caso, cualquier sentencia pesada tendría un impacto directo en el rendimiento de la base de datos:

ALTER PROFILE <NOMBRE_PERFIL> LIMIT LOGICAL_READS_PER_CALL UNLIMITED;

Sugerencias como solución alternativa (válido para cualquier usuario)

Sabemos que este error aparece cuando superamos el límite fijado por el administrador de la base de datos. Sabiendo esto, podemos dar con una solución alternativa a este problema, que sería filtrar nuestra sentencia o proceso, reduciendo la carga de datos y minimizando su coste.

Sé que esto no es válido para todo el mundo, pero en muchas ocasiones puede servir.

Imaginad que estamos lanzando un proceso que elimina o altera todos los pedidos realizados durante los años comprendidos entre el 2000 y el 2020. Al lanzarlo obtenemos el ORA-02395 puesto que la sentencia es muy compleja y abarca muchos datos.

Estamos intentando eliminar los pedidos de 20 años de una sola vez y no está funcionando, pero… ¿Qué pasaría si filtrásemos estos datos y fuésemos eliminando los pedidos año a año?

De esa forma reduciríamos 20 veces el coste de la sentencia/proceso, ya que pasaríamos de eliminar 20 años de golpe a 1, y muy probablemente de esa forma sí que podríamos conseguir nuestro objetivo. Filtrar puede ser un poco más tedioso pero puede sacarnos del apuro.

Deja un comentario