SQL Server - Diferencias tiempo de ejecución script

 
Vista:

Diferencias tiempo de ejecución script

Publicado por giko (1 intervención) el 08/10/2008 08:58:00
Buenas a todos

A ver si laguien puede echarme un cable con esto.
Tengo el siguiente script para ejecutar en un servidor de producción:

declare @productoco integer

declare cursorproductsCO cursor for
select productid from products
where clientid in
(select clientid from clients where sin in (select sin collate Traditional_Spanish_CI_AS_WS from tempdb..tabla))
and campo<> 1

open cursorproductsco
fetch cursorproductsco into @productoco
while (@@fetch_status = 0)
begin

update products set campo=1 where productid=@productoco
fetch cursorproductsco into @productoco

end
close cursorproductsco
deallocate cursorproductsco

Lógicamente, antes de ejecutarlo en producción lo he probado en un servidor de test, que es una máquina con hardware mucho menor que la de producción.
Ambos servidores son Microsoft SQL Server 2005, y tienen la misma configuración. El caso es que en el servidor de test, la ejecución tarda 45 minutos para actualizar 5000 filas, y en el servidor de producción, depués de ejecutarlo por tres veces (la primera lo paré a las 6 horas, la segunda a las 2 horas, y la tercera a las 4 horas), aún quedan por actualizar casi 2000 filas.
Lo he ejecutado con el Management Studio, con usuarios conectados (la primera vez); también sin usuarios conectados (la segunda vez) y, por último, mediante un trabajo programado durante la noche (la tercera vez).

¿A alguien se le ocurre alguna razón por la que el servidor se pueda estar comportando así?

Muchas gracias por adelantado.
Un saludo
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Diferencias tiempo de ejecución script

Publicado por Isaias (3308 intervenciones) el 08/10/2008 18:05:14
1.- Si, la respuesta es muy sencilla, SQL SERVER, no fue diseñado para recorrer "registro x registro", es muy rapido en procesar GRANDES CANTIDADES DE DATOS, pero no lo quieras hacer trabajar registro-a-registro

2.- Deberias saber, que los cursores se crean en memoria, esto es, TODOS los registros que tenga tu cursor, estaran en la memoria, por tanto, ¿porque te asusta su lentitud?, Solucion, elimina los cursores

3.- Existen indices en tu tabla, ¿no?, entonces estas recorriendo tu update, de forma secuencial.

4.- Existe un metodo para actualizar grandes cantidades de datos, te coloco el script que debes probar:

-- Creo mi tabla temporal, en lugar de usar un cursor
CREATE TABLE #TEMPORAL (productid INT)

-- Inserto los registros a procesar
INSERT INTO #TEMPORAL (productid)
select productid from products -- Se asume que productid es UNICO, de lo contrario agrega el DISTINCT
where clientid in
(select clientid from clients where sin in (select sin collate Traditional_Spanish_CI_AS_WS from tempdb..tabla))
and campo<> 1

SET ROWCOUNT = 10000 -- Actualizara de 10000 en 10000
DECLARE @productoco integer
WHILE EXISTS(SELECT productid FROM #TEMPORAL)
BEGIN
SELECT TOP 1 @productoco = productid FROM #TEMPORAL
WHILE EXISTS(SELECT productid FROM products WHERE productid=@productoco AND campo <> 1)
BEGIN
update products set campo=1 where productid=@productoco AND campo <> 1
CONTINUE
END
DELETE #TEMPORAL WHERE productid = @productoco
CONTINUE
END
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Diferencias tiempo de ejecución script

Publicado por jose camilo (21 intervenciones) el 10/10/2008 01:37:04
yo hago actualizaciones a puro codigo en un procedimiento externo y me toma actualizar 100,000 registro unos 15 minutos es mas soy alergico a procedimientos incluidos estoy chapado a lo antiguo con esto. solo lo utilizo para golpear base de datos en la web
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Diferencias tiempo de ejecución script

Publicado por Isaias (3308 intervenciones) el 10/10/2008 20:00:20
100, 000 registros actualizados en 15 minutos, es demasiado tiempo, deberia hacerlo en menos de 30 segundos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar