Ver Mensaje Individual
  #6 (permalink)  
Antiguo 17/02/2012, 20:52
Avatar de matanga
matanga
 
Fecha de Ingreso: octubre-2007
Ubicación: España
Mensajes: 1.091
Antigüedad: 16 años, 6 meses
Puntos: 85
Respuesta: Sql server 2008 lento

La optimización de un proceso se hace a diferentes niveles y siguiendo un orden, y los índices, aunque sean importantes, se suelen dejar para el final.

En este caso, primero deberías optimizar la lógica del proceso, puedes actualizar la tabla TablaContactos con un solo update en vez de 4300 update dentro del loop.

Set rs = ConData.Execute("Select ClienteCodigo,ClienteComercial From TablaClientes Where ClienteComercial = 'Pedro' ")
Do While Not rs.EOF
sSQL_1="UPDATE TablaContactos SET ContactoComercial='Cliente de Pedro' WHERE ContactoCodigoCliente = rs("ClienteCodigo")"
Set RS_1 = ConData.Execute(sSQL_1)
rs.MoveNext
Loop
rs.Close

vs

Set rs = ConData.Execute("update TablaContactos
set ContactoComercial='Cliente de Pedro'
from TablaClientes
where
TablaClientes.ClienteCodigo = TablaContactos.ContactoCodigoCliente
and TablaClientes.ClienteComercial = 'Pedro'")

Lo segundo es evaluar las diferencias entre SQL Server y Access, es cierto que SQL Server tiene mejor tiempo de respuesta en las consultas pero también tiene más costo en la gestión de las sesiones por lo que deberías optimizar los accesos a la base, por ejemplo en el caso del loop:

'Loop en la aplicación, se ejecutan 10 sentencias
var i int=1
Do While i < 10
sSQL="UPDATE t1 SET id=" + i + "
Set RS = ConData.Execute(sSQL)
i = i + 1
Loop

vs

'Loop en la base de datos, se ejecuta 1 sentencia
sSQL="declare @i int
set @i = 1
while @i < 10
begin
update t1 set id = @i
set @i = @i + 1
end"
Set rs = ConData.Execute(sSQL)

Y en tercer lugar los índices, para esto debes analizar el plan de ejecución de las consultas, a simple vista se podría sugerir indexar los campos CodigoCliente y ClienteComercial.

Saludos