Beneficios de compartir cursores

El golfo de Marsella desde l'Estaque - Paul Cezanne

El golfo de Marsella desde l'Estaque - Paul Cezanne

Cuando Oracle encuentra que una setencia SQL submitida ya existe en la Sql Area, la fase de parseo es mucho mas acotada
y el cursor existente es reutilizado. Los beneficios mas importantes que se obtienen al compartir cursores son

– Disminucion del tiempo requerido en la etapa de parseo.
– Utilizacion muchisimo mas eficiente de la memoria.

En el post “Que es un cursor y para que sirve“, se presenta un grafico ilustrativo que ayuda a entender como el uso eficiente
de los cursores favorece al buen uso de la memoria compartida.

Anuncios

Fetch

En la etapa de fetch, Oracle recupera las filas de una sentecia SELECT. Normalmente cada fetch recupera multiples filas
utilizando un “arreglo de fetch” o “array fetch”.
Las herramientas Oracle ofrecen diferentes modos para cambiar el tamaño de dicho arreglo. Por ejemplo, en SqlPlus el seteo
de la variable ARRAYSIZE permite modificar el tamaño del arreglo de fetch. El valor por defecto en SqlPlus es 15.

Ejecucion

En la etapa de ejecucion Oracle aplica el plan de ejecucion determinado en la etapa de parseo y ejecuta las lecturas fisicas, logicas y ordenamientos necesarios.

Es interesante destacar una sutil diferencia entre ordenamientos para sentencias de modificacion de datos (insert, update,
delete) y sentecias de consulta.

Al ejecutar una sentencia INSERT, UPDATE o DELETE Oracle realiza una ejecucion inmediata de dicha sentencia en la etapa de ejecucion. En una sentecia SELECT que requiere que las filas sean ordenadas (por tener un ORDER BY o un GROUP BY), Oracle recupera todas las filas en esta etapa. Si, en cambio, la sentencia no requiere operaciones de ordenamiento, Oracle simplemente
ubica un puntero en la primer fila a retornar.

Binding

En la fase de binding Oracle verifica la sentencia buscando referencias a variables de binding (bind variables).
Luego Oracle asigna los valores a cada una de las variables. Notese que el plan de ejecucion se resolvio en la etapa
anterior y por lo tanto Oracle no sabia los valores de las variables en el momento en que selecciono el plan de ejecucion.
Este orden en las etapas de resolucion de una sentencia hace que sea imposible para el optimizador estimar la selectividad
del predicado. Este tema lo discutiremos en detalle mas adelante.

Parseo

En la etapa de parseo o parsing Oracle hace lo siguiente:

Busca la sentencia en la shared pool
Chequea que la sintaxis respete la gramatica y especificaciones del lenguaje SQL
Cheque la semantica, asegurando que los obejtos referenciados sean validos y satisfagan las restricciones de seguridad
Determina que el proceso que ejecuta la sentencia tenga los privilegios apropiados
Transforma las sentencias SQL hechas sobre vistas en sentencias SQL equivalentes sobre los objetos definidos en la vista e intenta simplificar las sentencias con un subquery reescribiendolas utilizando un join.
Determina y almacena el plan de ejecucion, o de ser posible, utiliza un plan de ejecucion existente. La determinacion del plan de ejecucion es la parte mas costosa de la fase de parsing y en algunas ocasiones puede llegar a demorar mas tiempo que la misma ejecucion del plan.