|
Cursores y Buffers
Generalidades-Cursores y Buffers
Básicamente, un cursor es un conjunto de punteros a las filas
devueltas por una consulta, la mayoría, son como un conjunto
de resultados, excepto por que los datos reales generalmente permanecen
en el servidor.
Un buffer es un depósito RAM en el lado del
cliente donde se guardan los datos del conjunto de resultados de manera
temporal hasta que pueden llevarse a otro lugar para su almacenamiento.
Las columnas de datos de una o varias filas se dice
que son miembros del cursor si la cláusula WHERE de la consulta
las incluye. Esta columnas, combinadas en filas lógicas se
convierten en filas miembro del conjunto de resultados.
Por ejemplo:
SELECT
Nombre, Genero
FROM
Animales
WHERE
Edad < 10
Cuando se ejecuta esta consulta, el motor cliente empieza inmediatamente
a seleccionar miembros para el conjunto de resultados. En este caso
son todos los animales menores de diez años.
Si no es necesaria una ordenador, el SGDB pasa las
primeras filas de este conjunto de resultados de vuelta a la estación
de trabajo nada más capturarlas y después detiene el
procesamiento hasta que la estación recupera las filas capturadas,
una vez recuperadas el gestor de datos pasa más filas y así
sucesivamente. Debido a este proceso, si otros usuarios están
actualizando la base de datos, hay posibilidades que se añada
otra fila que cumpla las condiciones del conjunto de resultados; en
este caso la fila añadida pasa a ser miembro del conjunto y
es recuperada por la estación de trabajo. También existe
la posibilidad de la eliminación o modificación de una
fila, en estos casos, si la fila no ha sido enviada a la estación
de trabajo o no se envía o se envía modificada; pero
siempre cabe la posibilidad de que la estación de trabajo haya
leído una fila que ya no existe o que haya sido modificada
por otro usuario. Estas actualizaciones no se incluirán en
el conjunto de resultados si la estación de trabajo ha comenzado
a procesar los resultados.
El proceso de relleno del cursor finaliza cuando el
gestor de datos ha determinado cual es la última fila del conjunto
de resultados y se considera completamente relleno cuando la estación
de trabajo ha capturado la última fila, en este momento cuando
se conoce el número de filas que componen el cursor. Por este
motivo los métodos o propiedades que informan del número
de filas devueltas o afectadas no son reales hasta que el cursos no
se rellenado completamente.
Ubicación de los cursores
Como ya se ha comentado un cursor es un conjunto de punteros a un
conjunto de resultados. Estos punteros pueden estar ubicados en el
servidor o en la estación de trabajo, originando dos tipos
de cursores, los cursores del lado del cliente y los cursores del
lado del servidor. Pero no todos los gestores de datos permiten crear
cursores en el lado del servidor, sólo se pueden crear con
aquellos gestores que tengan comportamiento cliente / servidor.
Las ventajas e inconvenientes de cada tipo de cursor
es muy variable y depende siempre de la explotación que se
desee hacer de los datos, de la topología de la red y de los
equipos empleados. En general los cursores en el lado del servidor
reducen los tiempos de acceso a los datos y mejoran el desplazamiento
por el conjunto de resultados, si embargo consumen más cantidad
de recursos de servidor y de red.
Tipos de cursores
Conjuntos de resultados sin cursor
Con un conjunto de resultados sin cursor las filas de datos pasan
al frontal para su procesamiento. Este el sistema más rápido
para llevar los datos desde el servidor al cliente, pero no ofrece
los beneficios del cursor, por que, si bien algunos son actualizables,
a menudo no lo son y hay que controlar el proceso desde el frontal
para controlar las modificaciones.
Cursores desplazables
Uno de los aspectos más costosos de la administración
de los cursores es dar soporte a la capacidad de desplazamiento. Esta
capacidad significa que, una vez ejecutada una consulta, un cursor
desplazable permite la colocación en cualquier fila del conjunto
de resultados. Estos métodos de reubicación son costosos
en el sentido que consumen recursos del sistema. Para aumentar el
rendimiento se aconseja limitar los cursores y seleccionar los no
desplazables.
Cursores de sólo avance
Este tipo de cursor sólo permite utilizar los métodos
para desplazarse avanzando por las filas del conjunto de resultados,
no permiten el retroceso por las mismas. En este caso el gestor de
datos enviará las filas del conjunto de resultados tan rápido
como le sea posible.
Cursores estáticos
Un cursor estático proporciona la capacidad de direccionamiento
por todo el conjunto de resultados generando una copia en la estación
de trabajo de las filas devueltas, todos los trabajos realizados sobre
este conjunto de resultados afectará únicamente a la
copia local. Por su naturaleza este cursor necesita de un espacio
de almacenamiento en el cliente. Este cursor no es la mejor opción
para datos que cambian constantemente, pero para tablas de búsqueda
cuyos valores no es probable que cambien, este cursor tiene mucho
sentido.
Cursores de conjunto de claves
Un cursor de conjunto de claves, u hoja de respuesta dinámica,
almacena un conjunto de claves, básicamente un conjunto de
punteros, y permite volver a capturar una fila seleccionada de acuerdo
con la información específica de la fila almacenada
en dichas claves. Estos cursores necesitan espacio de almacenamiento
independiente para los datos de cada una de las claves que lo componen.
Cualquier cambio o modificación sobre una fila del conjunto
de resultados por parte de cualquier usuario es reflejado en cualquier
estación de trabajo al leer la información de dicha
fila.
Cursores dinámicos
Al igual que en los dos casos anteriores, un cursor dinámico
almacena un bloque de claves. Sin embargo, con este tipo de cursor,
la consulta que se ha utilizado para generar el conjunto de resultados
se vuelve a ejecutar constantemente siempre que se hace referencia
al cursor. Debido a esta actividad repetida, los cursores dinámicos
consumen gran cantidad de recursos, pero poseen la gran ventaja que
jamás cierran la pertenencia o no pertenencia de las filas
al conjunto de resultados. En los dos casos anteriores una vez rellenado
el cursor no se admite la inclusión o exclusión de filas.
Cursores de sólo lectura
Todos los tipos de cursores citados admiten la posibilidad de sólo
lectura, en este caso ninguna de las filas del conjunto de resultados
pueden ser modificadas por la estación de trabajo. Este cursor
es muy útil para la generación de consultas o informes
en donde se sabe que ningún dato será modificado. Poseen
la ventaja y el inconveniente de no generar bloqueos sobre las filas
consultadas, de tal forma que cualquier usuario puede editar las filas
contenidas en este cursor.
Tipos de buffers
Buffers de una única fila
Un buffer de una única fila no es en realidad un cursor, aunque
aquí se apliquen las mismas reglas de pertenencia que se aplican
a un cursor de conjunto de claves de sólo avance. Con un buffer
de una única fila sólo es posible examinar los datos
de la fila del conjunto de resultados. Las filas anteriores no están
disponibles y la fila actual no estará accesible después
de pasar a la siguiente fila del conjunto de resultados.
Buffers de n filas
Un buffer de n filas amplía el ámbito y la capacidad
de desplazamiento del buffer de una única fila. En este caso,
a la estación de trabajo se le expone un número determinado
de filas del conjunto de resultados y a la aplicación se le
permite que se desplace libremente por esas filas.
|