Cursores.ventajas-desventajas

27/08/2003 - 08:17 por mani14 | Informe spam
He leído un poco sobre este tema, y todo lo que veo son
comentarios negativos hacia los cursores. Estoy hablando
con respecto a la eficiencia del programa que los utilice.
Me gustaria que opinaseis sobre este tema. Yo acabo de
hacer una cosilla (con cursores), y ahora estoy intentando
quitarselos. La cuestion es: Todo lo que se puede hacer
con cursores se puede hacer sin ellos? todo? Me gustaria
que expresaseis lo que pensais sobre este tema (es que me
parece muy interesante), y si alguien se anima, puede
incluso poner algun ejemplo de como solucionó un problema
que inicialmente habia hecho con cursores y luego lo
soluciono sin ellos.
Yo por mi parte en cuanto solucione mi tema, lo pondré en
este post. Muchas gracias.
Saludos a todos.
Félix Vela

Preguntas similare

Leer las respuestas

#1 Carlos Sacristan
27/08/2003 - 09:02 | Informe spam
Efectivamente, prácticamente todo lo que se puede hacer con cursores se
podría hacer sin ellos. Al principio es fácil caer en la tentación de
utilizarlos porque parece que facilitan la vida al poder tratar los
registros de un conjunto de resultados de forma individual; sin embargo,
justamente esta "ventaja" es su problema. Hay que tener en cuenta que SQL
Server está pensado para manejar conjunto de resultados, y si le obligas a
tratar dicho conjunto de forma individual el rendimiento cae en picado:
muchos recursos utilizados durante mucho más tiempo del necesario para poder
mantener esos datos.

TSQL es un lenguaje muy potente y según se va conociéndole más cuenta
te das de ello. Algo que parece imposible realizar con una única sentencia,
después de una buena pensada (y si se tiene suficiente experiencia) es
posible. No hay más que seguir durante un tiempo las respuestas que alguno
de los asiduos participantes de este grupo publican.

Yo, personalmente, hace tiempo que los ignoro. No los contemplo como una
opción cuando tengo que realizar una consulta complicada (así evito
"tentaciones"). Es mucho más gratificante ver cómo es posible obtener los
resultados que necesitas a través de una sentencia que por medio de un
cursor, por eso no te puedo poner ningún ejemplo de lo que comentas.



Un saludo

-
"Sólo sé que no sé nada. " (Sócrates)

Por favor, responder únicamente al foro

(Guía de netiquette del foro)
http://www.helpdna.net/bosqlfaq00.htm
http://perso.wanadoo.es/rubenvigon/foro

(FAQ's de SQL Server)
http://support.microsoft.com/defaul.../70faq.asp
http://www.helpdna.net/bosqlfaq.htm

"mani14" escribió en el mensaje
news:066f01c36c62$f4e85ed0$
He leído un poco sobre este tema, y todo lo que veo son
comentarios negativos hacia los cursores. Estoy hablando
con respecto a la eficiencia del programa que los utilice.
Me gustaria que opinaseis sobre este tema. Yo acabo de
hacer una cosilla (con cursores), y ahora estoy intentando
quitarselos. La cuestion es: Todo lo que se puede hacer
con cursores se puede hacer sin ellos? todo? Me gustaria
que expresaseis lo que pensais sobre este tema (es que me
parece muy interesante), y si alguien se anima, puede
incluso poner algun ejemplo de como solucionó un problema
que inicialmente habia hecho con cursores y luego lo
soluciono sin ellos.
Yo por mi parte en cuanto solucione mi tema, lo pondré en
este post. Muchas gracias.
Saludos a todos.
Félix Vela
Respuesta Responder a este mensaje
#2 Félix Vela mani14
27/08/2003 - 09:31 | Informe spam
Lo que dices es muy interesante, va en la linea de los
articulos que he leido. EN mi caso, y "gracias" a mi
inesperiencia, primero lo he hecho con cursores, para
conseguir que funcione (que ha sido todo un reto, y ha
sido gracias a la ayuda de los foristas), y ahora me he
planteado como he comentado antes la optimizacion del
codigo. Una cosa esta clara, es mucho mas fácil la
utilizacion de cursores, que hacerlos sin ellos. En este
punto yo me planteo (y con bastantes posibilidades de
equivocarme) la siguiente situacion.
Es realmente necesario invertir ese tiempo en conseguir
hacerlo sin cursores, puediendolo hacer con cursores de
forma mas sencilla? No estoy diciendo que sea defensor de
los cursores ni mucho menos (que nadie se me heche
encima, ;-) ) pero para que tengamos discusión no todos
podemos estar de acuerdo, lo que intento es ver el limite
entre la necesaria NO utilizacion por causa de
rendimiento. Yo por ejemplo tengo solo dos cursores, no se
si son muchos o pocos, pero seria realmente necesario
intentar quitarlos? O quizas vaya a invertir demasiado
tiempo en algo que no me va a optimizar demasiado la
ejecucion del programa. Máximo rendimiento, minimo
esfuerzo.
Bueno, paro que me he enrollado demasiado. Disculpen.
Espero sus respuestas, sus quejas por mi exposicion .
Saludos.
Félix Vela Sainza
Respuesta Responder a este mensaje
#3 Félix Vela
27/08/2003 - 09:58 | Informe spam
Muchas Gracias por tu valoración. Es de agradecer. Te
aseguro que lo tendré encuenta para proximos trabajos. De
todas formas este como ya te he comentado lo he acabado
antes de lo previsto y tengo un margen para intentar
hacerlo sin cursores. Seguire intentandolo, y sino me sale
tendreis noticias mias, seguro, jejejej. Gracias de verdad.
Saludos.
Félix Vela.
Respuesta Responder a este mensaje
#4 Félix Vela mani14
27/08/2003 - 12:49 | Informe spam
Como ya he comentado estoy intentando quitar los dos
cursores que tengo en mi procedimiento almacenado. No se
si no veo la idea, pero no lo consigo hacer.
os comento mis cursores.
1.DECLARE nombre CURSOR FOR
SELECT name
FROM sysdatabases

OPEN nombre --abro el cursor

FETCH NEXT
FROM nombre
INTO @nombres
WHILE @@FETCH_STATUS=0
y continua el codigo, esto me hara recorrer una a una
todas las bases de datos por las que tengo que pasar.

2.exec('use '+''+@nombres+''+' DECLARE tables CURSOR FOR
SELECT TABLE_NAME
FROM INFORMATION_SCHEMA.TABLES')

open tables

FETCH NEXT
FROM tables
INTO @tablename
WHILE @@FETCH_STATUS = 0
Este lo tengo dentro del otro, con lo que me dara las
tablas de la base de datos en la que me encuentro.

La cuestion es que no se como quitarlo, Con el cursor cojo
el conjunto al hacer el select y ya con eso pues lo
recorro, pero sin el cursor no se como generar uno a uno
las bases de datos, pensando pensando y no se me ocurre.
He pensado en varias cosas, pero aunque consiguiese
hacerlo, luego me doy cuenta que deberia de replicar el
codigo tantas veces como bases de datos tengo, y eso es
una barbaridad.No puedo replicar el codigo intermedio
tantas veces, y menos despues lo mismo por cada tabla. Se
que me equivoco, que no se asi, pero no se me ocurre. Si
me diesen un empujoncito, para ver la idea os lo
agradeceria. Gracias. Saldudos.
Félix Vela Sainza

Pda: No se porque me da que he dicho unas cuantas
barbaridades, pero bueno, ahi lo dejo, si me decis lo que
son incoherencias, no se volvera a repetir, y no vale
decir que todo es una incoherencia. ;).
Respuesta Responder a este mensaje
#5 Carlos Sacristan
27/08/2003 - 13:29 | Informe spam
Efectivamente lo que estás haciendo es una de las causas por las que son
necesarios los cursores. Otra cosa es para qué estás haciendo eso (la
finalidad de tu procedimiento), y es ahí donde podríamos ver otras opciones.

P.D.: de todos modos, existen unos procedimientos no documentados que
sirven justamente para recorrerse las bases de datos y tablas
(sp_MSforeachdb y sp_MSforeachtable, respectivamente)


Un saludo

-
"Sólo sé que no sé nada. " (Sócrates)

Por favor, responder únicamente al foro

(Guía de netiquette del foro)
http://www.helpdna.net/bosqlfaq00.htm
http://perso.wanadoo.es/rubenvigon/foro

(FAQ's de SQL Server)
http://support.microsoft.com/defaul.../70faq.asp
http://www.helpdna.net/bosqlfaq.htm

"Félix Vela mani14" escribió en el mensaje
news:0b8501c36c88$e4944460$
Como ya he comentado estoy intentando quitar los dos
cursores que tengo en mi procedimiento almacenado. No se
si no veo la idea, pero no lo consigo hacer.
os comento mis cursores.
1.DECLARE nombre CURSOR FOR
SELECT name
FROM sysdatabases

OPEN nombre --abro el cursor

FETCH NEXT
FROM nombre
INTO @nombres
WHILE @@FETCH_STATUS=0
y continua el codigo, esto me hara recorrer una a una
todas las bases de datos por las que tengo que pasar.

2.exec('use '+''+@nombres+''+' DECLARE tables CURSOR FOR
SELECT TABLE_NAME
FROM INFORMATION_SCHEMA.TABLES')

open tables

FETCH NEXT
FROM tables
INTO @tablename
WHILE @@FETCH_STATUS = 0
Este lo tengo dentro del otro, con lo que me dara las
tablas de la base de datos en la que me encuentro.

La cuestion es que no se como quitarlo, Con el cursor cojo
el conjunto al hacer el select y ya con eso pues lo
recorro, pero sin el cursor no se como generar uno a uno
las bases de datos, pensando pensando y no se me ocurre.
He pensado en varias cosas, pero aunque consiguiese
hacerlo, luego me doy cuenta que deberia de replicar el
codigo tantas veces como bases de datos tengo, y eso es
una barbaridad.No puedo replicar el codigo intermedio
tantas veces, y menos despues lo mismo por cada tabla. Se
que me equivoco, que no se asi, pero no se me ocurre. Si
me diesen un empujoncito, para ver la idea os lo
agradeceria. Gracias. Saldudos.
Félix Vela Sainza

Pda: No se porque me da que he dicho unas cuantas
barbaridades, pero bueno, ahi lo dejo, si me decis lo que
son incoherencias, no se volvera a repetir, y no vale
decir que todo es una incoherencia. ;).
Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida