utilizar cursores en SP o utilixar DataReader

22/12/2005 - 15:25 por andy O | Informe spam
Hola a todos

Quisiera saber¿ qué es más óptimo?, utilizar cursores dentro de un store
procedure para recorrer los registros y luego realizar operaciones como
delete, update o insert a otras tablas, o utilizar un datareader o un dataset
para poder recorrelo y hacer las operaciones ya mencionadas.

Espero que me ayuden.
Gracias.

Preguntas similare

Leer las respuestas

#1 Tristan
23/12/2005 - 17:53 | Informe spam
Bueno, en realidad utilizar cursores es casi siempre la opción menos
eficiente que existe. Precisamente por eso se han eliminado de ado.net. Un
cursor obliga al SGBD a mantener una buena cantidad de recursos. Si son
muchos los usuarios conectados simultaneamente, los cursores degradan el
rendimiento de forma exponencial. Los cursores son eficientes con cargas
pequeñas de trabajo pero nunca se deben utilizar si la carga es grande.

Ahora bien si se necesita avance y retroceso (por ej. paginación) utilizar
cursores puede ser la forma más eficiente, tal vez también cuando se
necesite actualizar tras la consulta, pero son pocos los casos en los que
sería conveniente. Normalmente la forma más eficiente de obtener datos es a
través del cursor FireHose también llamado "no cursor", es decir el sistema
utilizado por DataReader o el Fill del DataAdapter, en el cursor de solo
avance y solo lectura el SGBD devuelve datos a medida que dispone de ellos
con lo que prácticamente no desperdicia recursos en el mantenimiento.

Juan Carlos Badiola
MVP - C#
Respuesta Responder a este mensaje
#2 Tristan
23/12/2005 - 17:57 | Informe spam
Por cierto, releyendo tu pregunta me queda la duda del tipo de operaciones
que pretendes hacer.

Si lo que quieres es realizar actualizaciones sobre una BD, sin consultas o
actualizaciones de múltiples usuarios, puede ser una de las pocas ocasiones
en que sea beneficioso utilizar cursores.

Juan Carlos Badiola
MVP - C#
Respuesta Responder a este mensaje
#3 A.Poblacion
24/12/2005 - 09:54 | Informe spam
"Tristan" wrote in message
news:examZF%
Bueno, en realidad utilizar cursores es casi siempre la opción menos
eficiente que existe. Precisamente por eso se han eliminado de ado.net. Un
cursor obliga al SGBD a mantener una buena cantidad de recursos. Si son
muchos los usuarios conectados simultaneamente, los cursores degradan el
rendimiento de forma exponencial. Los cursores son eficientes con cargas
pequeñas de trabajo pero nunca se deben utilizar si la carga es grande.



Hombre, depende de la operación. Si, por ejemplo, hay que modificar
valores en un millón de registros, es preferible utilizar un procedimiento
almacenado con un cursor que los recorra todos en el servidor que traerse el
millón de registros a un puesto cliente, modificarlos, y volver a transmitir
el millón de registros al servidor para que se graben. Sobre todo si, para
decidir los cambios en esos registros, hay que hacer por cada registro
varias consultas a varias otras tablas dependiendo de los valores del
registro. Estas consultas a su vez tendrían que viajar también entre el
cliente y el servidor. Si con un procedimiento almacenado conseguimos
confinar todas estas operaciones dentro del servidor, saldremos ganando
mucho, incluso aunque el servidor tenga que asignar algunos recursos propios
para procesar los cursores que haya dentro del procedimiento.
Respuesta Responder a este mensaje
#4 Tristan
24/12/2005 - 12:18 | Informe spam
Si, a eso me refería precisamente. Depende del tipo de operación. Para una
típica operación de consulta de una fila, presentación y modificación por
parte del usuario, y actualización de la BD, no se deben utilizar cursores.
Especialmente si los usuarios concurrentes van a ser muchos. Por el
contrario para una única actualización masiva, como bien dices, podría ser
poco eficiente volcar los datos al cliente, y ejecutar un comando de
actualización.

En resumen, creo que como norma general se debe evitar el uso de cursores,
aunque hay casos en que pueden ser recomendables.

Juan Carlos Badiola
MVP - C#
Respuesta Responder a este mensaje
#5 José Antonio
26/12/2005 - 08:01 | Informe spam
Como bien dices, como norma general hay que evitar el uso de cursores, en
algunos casos no queda mas rmedio que utilizarlos, pero en ningun caso son
recomendables, si existe una solucion alternativa.
"Tristan" escribió en el mensaje
news:
Si, a eso me refería precisamente. Depende del tipo de operación. Para una
típica operación de consulta de una fila, presentación y modificación por
parte del usuario, y actualización de la BD, no se deben utilizar
cursores. Especialmente si los usuarios concurrentes van a ser muchos. Por
el contrario para una única actualización masiva, como bien dices, podría
ser poco eficiente volcar los datos al cliente, y ejecutar un comando de
actualización.

En resumen, creo que como norma general se debe evitar el uso de cursores,
aunque hay casos en que pueden ser recomendables.

Juan Carlos Badiola
MVP - C#

email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida