Cursores en SQL2008

07/07/2009 - 22:54 por Joseluis Pesudo | Informe spam
Hola a todos
Acabo de migrar un servidor con Windows2000 server, SQL2000 y 1GB de Ram a
otro con Windows2008, SQL2008 y 6Gb de Ram

Para mi sorpresa un procedimiento almacenado usando un cursor sobre una
tabla de 400-500.000 registros tardaba 3 minutos en el viejo y ahora tarda
160 minutos ¿?

¿Teneis alguna experiencia en el uso de cursores en SQLServer 2008?
Gracias

Preguntas similare

Leer las respuestas

#1 Penta
08/07/2009 - 00:52 | Informe spam
Estimado.
Primero que todo, disculpe por no darle una solución al respecto.
Solo le diré que olvidese de los cursores.


Atte.
Penta.
Respuesta Responder a este mensaje
#2 Carlos Sacristan
08/07/2009 - 09:10 | Informe spam
¿Has analizado qué es lo que hace que tarde tanto? Seguramente no sea el
cursor, sino alguna instrucción dentro de ese procedimiento almacenado la
que haya cambiado su tiempo de ejecución.

¿Cómo hiciste la migración? ¿Actualizaste estadísticas después del proceso?

En cualquier caso, en la gran mayoría de las situaciones el uso del cursor
es una mala opción. Es probable que puedas reescribir ese código orientado a
conjunto de registros en vez de ir fila a fila. Pero esto es una
recomendación para SQL Server de todas las versiones, no sólo 2008

"Caminar sobre el agua y desarrollar software a partir de unas
especificaciones es fácil. si ambas están congeladas."
Edward V. Berard, ingeniero informático

http://blogs.solidq.com/es/elrincondeldba
"Joseluis Pesudo" <Joseluis wrote in
message news:
Hola a todos
Acabo de migrar un servidor con Windows2000 server, SQL2000 y 1GB de Ram a
otro con Windows2008, SQL2008 y 6Gb de Ram

Para mi sorpresa un procedimiento almacenado usando un cursor sobre una
tabla de 400-500.000 registros tardaba 3 minutos en el viejo y ahora
tarda
160 minutos ¿?

¿Teneis alguna experiencia en el uso de cursores en SQLServer 2008?
Gracias
Respuesta Responder a este mensaje
#3 Joseluis Pesudo
08/07/2009 - 09:40 | Informe spam
Ya sé que los cursores nunca es una solución buena pero en este caso tengo
que actualizar un campo en función de los valores de las filas anteriores y
no he encontrado otra solución basada en conjuntos de datos.

En cualquier caso es un procedimiento muy sencillo. La única sentencia en el
bucle del cursor es un update totalizando sobre un campo de la tabla.

Comprobaré las estadísticas pero el resto de consultas y procedimientos
funcionan perfectamente. Mejor que antes por supuesto

"Carlos Sacristan" wrote:

¿Has analizado qué es lo que hace que tarde tanto? Seguramente no sea el
cursor, sino alguna instrucción dentro de ese procedimiento almacenado la
que haya cambiado su tiempo de ejecución.

¿Cómo hiciste la migración? ¿Actualizaste estadísticas después del proceso?

En cualquier caso, en la gran mayoría de las situaciones el uso del cursor
es una mala opción. Es probable que puedas reescribir ese código orientado a
conjunto de registros en vez de ir fila a fila. Pero esto es una
recomendación para SQL Server de todas las versiones, no sólo 2008

"Caminar sobre el agua y desarrollar software a partir de unas
especificaciones es fácil. si ambas están congeladas."
Edward V. Berard, ingeniero informático

http://blogs.solidq.com/es/elrincondeldba
"Joseluis Pesudo" <Joseluis wrote in
message news:
> Hola a todos
> Acabo de migrar un servidor con Windows2000 server, SQL2000 y 1GB de Ram a
> otro con Windows2008, SQL2008 y 6Gb de Ram
>
> Para mi sorpresa un procedimiento almacenado usando un cursor sobre una
> tabla de 400-500.000 registros tardaba 3 minutos en el viejo y ahora
> tarda
> 160 minutos ¿?
>
> ¿Teneis alguna experiencia en el uso de cursores en SQLServer 2008?
> Gracias


Respuesta Responder a este mensaje
#4 Ele
08/07/2009 - 18:54 | Informe spam
porque no se deben usar los cursores?
He hecho pruebas para el caso de actualizar campos nuevos (cuando agrego una
columna a la tabla) si el query lo escribo solo con la instruccion 'update
tabla set campo = @valor' este demora demasiado en cambio si hago un cursor
donde seleciono la llave primaria y dentro del cursor escribo la instruccion
'update tabla set campo = @valor where llave= @llave' el tiempo que tarda es
poco casi inmediato

"Penta" escribió en el mensaje
news:
Estimado.
Primero que todo, disculpe por no darle una solución al respecto.
Solo le diré que olvidese de los cursores.


Atte.
Penta.
Respuesta Responder a este mensaje
#5 Maxi
08/07/2009 - 20:05 | Informe spam
Hola, son muy lentos y tus procesos generaran muchos loqueos, no es que no
se deben usar sino no existirian, se deben usar solo en los casos que no hay
otro remedio y que ademas sea la forma mas eficiente de hacerlo, eso pasa en
una cantidad muy chica de opciones



Maxi Accotto
Microsoft MVP en SQL Server
Consultor en SQL Server
http://blog.maxiaccotto.com



"Ele" escribió en el mensaje de
noticias:#MzfOz#$
porque no se deben usar los cursores?
He hecho pruebas para el caso de actualizar campos nuevos (cuando agrego
una columna a la tabla) si el query lo escribo solo con la instruccion
'update tabla set campo = @valor' este demora demasiado en cambio si hago
un cursor donde seleciono la llave primaria y dentro del cursor escribo la
instruccion 'update tabla set campo = @valor where llave= @llave' el
tiempo que tarda es poco casi inmediato

"Penta" escribió en el mensaje
news:
Estimado.
Primero que todo, disculpe por no darle una solución al respecto.
Solo le diré que olvidese de los cursores.


Atte.
Penta.

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