El parametro CURSOR_SHARING

Como vimos en el post Parseo, la etapa de parseo compara el texto de una sentencia con las sentencias existentes en la shared pool a fin de determinar si la sentencia puede ser compartida. Si el texto de la sentencia difiere, Oracle no comparte el cursor. El parametro CURSOR_SHARING permite al DBA modificar este comportamiento de “matching” del parser de SQL de Oracle. El valor por defecto de este parametro es EXACT, el cual fuerza al parser a buscar una sentencia exactamente igual para que el cursor pueda ser compartido. Dicho comportamiento puede ser modificado cambiando el valor del parametro CURSOR_SHARING a SIMILAR o FORCE, el cual permite que el parser considere como identicas todas las sentencias que sean iguales en todos los aspectos excepto en los valores literales.

De este modo, dos sentencias que son iguales en todo excepto en los literales, podran compartirse si se modifica el comportamiento del parser de SQL a traves del parametro CURSOR_SHARING.

Por ejemplo, las sentencias

a) select * from clientes where cliente_id = 14;
b) select * from clientes where cliente_id = 66;

seran tomadas como diferentes si CURSOR_SHARING = EXACT y por lo tanto no compartiran cursor. En cambio seran consideradas como identicas si CURSOR_SHARING = SIMILAR o FORCE, y por lo tanto compartiran cursor.

Existen muchisimas aplicaciones ya desarrolladas que no hacen uso de variables de bind (bind variables) o utilizan sql dinamico. Estas aplicaciones muy probablemente esten haciendo mal uso de la memoria de Oracle y tengan problemas de performance debido al incremento del tiempo de respuesta de las sentencias SQL por no encontrar, en la library cache, cursores para compartir. El problema puede haber sido diagnosticado correctamente aunque modificar toda la aplicacion para que haga uso de variables de bind puede requerir de la inversion de un esfuerzo enorme. En estos casos la utilizacion de CURSOR_SHARING puede resultar sencilla y dar resultados inmediatos. Sin embargo, el uso de cursor sharing no esta recomendado para todos los ambientes ni todas las versiones de Oracle.

La diferencia entre SIMILAR y FORCE esta fuera del alcance de este post. Como mencionamos en el parrafo anterior, el uso de cursor sharing no esta recomendado para todos los ambientes ni versiones de Oracle. El lector puede recurrir a la documentacion oficial de Oracle para mas detalle.

Anuncios

1 comentario

  1. Gracias por el aporte, dentro de los temas de tunning que realice a mi base de produccion, nunca se me ocurrio que el desarrollador no utilizara variables BIND y mi Miss Cache Hit Ratio estaba en un 90% puse el CURSOR_SHARING en FORCE y listo


Comments RSS TrackBack Identifier URI

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