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 ordenación, 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.