Inicio » Oracle » Parámetros del int » ORA-1000 y los cursores abiertos:

ORA-1000 y los cursores abiertos:

OPEN CURSORS

El parámetro open cursor establece el máximo número de cursores abiertos por sesión. Si una sessión abre un número de cursores mayor a este parámetro aparecerá el ORA-1000. Los cursores abiertos ocupan espacio en la shared pool, en la library cache. El valor por defecto de OPEN_CURSOR es 50, pero Oracle recomienda que lo pongas para algunas aplicaciones hasta 500. Tom Kyte recomienda un valor cercano a 1000. Hay gente que no está de acuerdo con establecer un valor tan elevado y cree que los 50 del valor por defecto son más que suficientes, que la utilización de más 50 cursores por sesión implica que se debe revisar el código. A mi me parece un poco utópica está última postura, pero quien sabe.

SESSION CACHE CURSOR

 Es el número de cursores que se cachean en cada sesión. El valor de Session_cached_cursor puede ser mayor que el OPEN_CURSOR. Este no tiene nada que ver con el ORA-01000. Por lo tanto el parámetro OPEN_CURSORS no tiene efecto sobre el número cursos cachados. No hay relación entre ambos parámetros.
Si SESSION_CHACED_CURSOR no esta definido, el valor por defecto es 0 y ningún cursor será cacheado por sesión. (los cursores estarán cacheados en la shared pool, pero la sesión tendrá que encontrarlos). Si se define, cuando una solicitud de parseo es emitida, Oracle comprueba en la library Cache si se han realizado más de tres peticiones de parseo para esa sentencia. Si es así, Oracle mueve el cursor de sesión asociado con la sentencia al sesión cursor cache. Las siguientes solicitudes de parseo para esa sentencia en la misma sesión se obtienen del sesión cursor cache, evitando así el soft parse (Técnicamente, el parseo no puede ser completamente evitado, se hace algo todavía más suave que un soft parse, lo cual es más rápido y se evita consumo de cpu).En la session cursor cache, Oracle utiliza el algoitmo LRU, para determinar que cursores deben ser desalojados en caso de necesitar espacio.La ventaja obvia de los cachear los cursores por sesión  es reducir el tiempo de parseo. La otra ventaja es evitar los bloqueos (latches) en la shared pool y en la library cache ya que la sesión ya no va ahí a buscar las sentencias

Monitorear los cursores abiertos:

 Para empezar aclarar que la vista v$open_cursor no muestra los cursores abiertos sino los cacheados.Para buscar los cursores abiertos se debe recurrir a v$sesstat where name=’opened cursors current’.ofrece el número de cursors abiertos por sesión:   

SELECT a.VALUE, s.username, s.SID, s.serial#
  FROM v$sesstat a, v$statname b, v$session s
 WHERE a.statistic# = b.statistic#
   AND s.SID = a.SID
   AND b.NAME = 'opened cursors current'; 
 

 También es útil monitorearlos por usuario y maquina:

 --total cursors open, by username & machine       
 select sum(a.value) total_cur, avg(a.value) avg_cur, max(a.value) max_cur, s.username, s.machine        
 from v$sesstat a, v$statname b, v$session s         
 where a.statistic# = b.statistic#          
 and s.sid=a.sidand b.name = 'opened cursors current'         
 group by s.username, s.machineorder by 1 desc;

 Optimizando el parámetro OPEN_CURSORS:

 Lo mejor es no optimizarlo, si no abrir los suficientes para no tener que preocuparte por él. Si tus sesiones abren un número de cursores cercano al límite que has establecido para el parámetro OPEN_CURSORS súbelo.Si las das un valor elevado no significa que todas las sesiones utilicen ese número de cursores. Y si tienes un problema con una sesión en concreto, obtendrás el ORA-01000Para ver si tu parámetro OPEN_CURSORS está bien definido y para saber cual es la sesión que más cursores abre es útil está query:

select max(a.value) as highest_open_cur, p.value as max_open_cur
 from v$sesstat a, v$statname b, v$parameter p
 where a.statistic# = b.statistic#
  and b.name = 'opened cursors current'
   and p.name= 'open_cursors'
   group by p.value;
 

Después de incrementar lo cursores, revisa la vista v$ssestat para ver si el número de cursores abiertos en ese momento se incrementa para alguna de las sesiones. Si tienes alguna sesión de aplicación cuyos cursores siempre aumentan hasta alcanzar el parámetro OPEN_CURSOR, entonces seguramente hay un problema en código de tu aplicación y deja demasiados cursores abiertos.

6 pensamientos en “ORA-1000 y los cursores abiertos:

  1. Pingback: Los números de 2010 « Cajón de sastre sobre oracle

  2. Buena información, pero deberías decir para que versión de Oracle es esto.
    Ya que hay versiones como la 9i que tienen algunas de las vistas que pones en los ejemplos. Gracias.
    Saludos.

  3. Pingback: ORA-01000: número máximo de cursores abiertos excedido | Aprendiendo java 2009's Blog

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s