SQL Server - Optimización de UPDATE

 
Vista:
sin imagen de perfil
Val: 55
Ha mantenido su posición en SQL Server (en relación al último mes)
Gráfica de SQL Server

Optimización de UPDATE

Publicado por ANTONIO (28 intervenciones) el 24/09/2020 12:25:17
Hola tengo un problema a la hora de hacer un update. Este es mi código en C#:
1
2
3
4
5
6
7
8
9
UPDATE MPrecios
SET PendienteCalculo = 1,
FechaHoraModificado = GETDATE(),
IdUsuarioModifica = idUsuarioModifica
WHERE Borrado = 0 AND IdRegActivo IS NULL
AdminSQLGestion.CondicionFechaSinCaducar("MPrecios") + " " +
AND IdTipoCalculoPrecio <> 3 --Sólo los que no sean precio fijo
AND IdOrigen = idOrigen
AND IdDestino = idDestino
El problema es que tarda mucho. Me he planteado hacerlo por lotes (normalmente leería unos 71.000 rows) de esta forma:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
DECLARE @i INT=1
WHILE( @i <= 10 )  -- o lo que sea pertinente
  BEGIN
      UPDATE TOP(50) MPrecios
      SET PendienteCalculo = 1,
 FechaHoraModificado = GETDATE(),
 IdUsuarioModifica = idUsuarioModifica
 WHERE Borrado = 0 AND IdRegActivo IS NULL
--AdminSQLGestion.CondicionFechaSinCaducar("MPrecios") + " " +
 AND IdTipoCalculoPrecio <> 3 --Sólo los que no sean precio fijo
 AND IdOrigen = idOrigen
 AND IdDestino = idDestino
      SET @i=@i + 1
  END
Pero no se si hay alguna forma mejor como en procedimientos almacenados. ¿Podríais asesorarme? Muchas gracias.
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
Imágen de perfil de Wilfredo Patricio Castillo
Val: 268
Ha mantenido su posición en SQL Server (en relación al último mes)
Gráfica de SQL Server

Optimización de UPDATE

Publicado por Wilfredo Patricio Castillo (189 intervenciones) el 24/09/2020 22:18:38
Si tienes un procedimiento almancenado, igual lo puede invocar sin problemas.

Lo que me llama la atención es que al invocar a tu método o no se que cosa es, le envias un parámetro con espacio vacío?, tendrías que dar mas detalles al respecto
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil
Val: 55
Ha mantenido su posición en SQL Server (en relación al último mes)
Gráfica de SQL Server

Optimización de UPDATE

Publicado por ANTONIO (28 intervenciones) el 25/09/2020 08:57:37
Si, perdona, acabo de entrar en un proyecto en el que yo llevo la parte de Base de Datos en Sql Server, la persona que maneja el Visual Studio, encuentra un punto en el que el update no lo realiza en tiempos óptimos y me dice que como puedo agilizarlo. Al margen del código o del parametro, que en este momento tampoco se que invoca. Entiendo que a bote pronto no es fácil de explicar porque tendríamos que meternos en todo lo que arrastra desde atrás, por eso preguntaba si existe una forma más ótima de hacer un update dentro de un código c# de un modo genérico
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
Imágen de perfil de Francisco
Val: 73
Ha mantenido su posición en SQL Server (en relación al último mes)
Gráfica de SQL Server

Optimización de UPDATE

Publicado por Francisco (29 intervenciones) el 25/09/2020 17:31:48
Hola

Voy adar por sentado quela sentencia que pretendes ejecutar es la siguiente

1
2
3
4
5
6
7
8
9
10
11
UPDATE
  MPrecios
SET
  PendienteCalculo = 1,
  FechaHoraModificado = GETDATE(),
  IdUsuarioModifica = idUsuarioModifica
WHERE
  Borrado = 0
  AND IdRegActivo IS NULL
  AND IdTipoCalculoPrecio <> 3 --Sólo los que no sean precio fijo
  AND IdOrigen = idOrigen;

Reacomodando el WHERE

1
2
3
4
5
6
7
8
9
10
11
12
UPDATE
  MPrecios
SET
  PendienteCalculo = 1,
  FechaHoraModificado = GETDATE(),
  IdUsuarioModifica = idUsuarioModifica
WHERE
  IdOrigen = idOrigen
  AND IdDestino = idDestino
  AND Borrado = 0
  AND IdTipoCalculoPrecio <> 3 --Sólo los que no sean precio fijo
  AND IdRegActivo IS NULL;

Por lo tanto se debe crear un indice con la siguiente condiciones deberia acelerar esta actualizacion

1
2
3
4
5
CREATE INDEX idx_mprecios_update ON MPrecios(IdOrigen, IdDestino)
WHERE
  Borrado = 0
  AND IdTipoCalculoPrecio <> 3
  AND idRegActivo IS NULL;

NOTA: Como desconozco cual version de SQLServer tienes, es posible que falle al crear el indice!

Saludos
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
sin imagen de perfil
Val: 55
Ha mantenido su posición en SQL Server (en relación al último mes)
Gráfica de SQL Server

Optimización de UPDATE

Publicado por ANTONIO (28 intervenciones) el 28/09/2020 09:27:53
Muchas gracias, hice el index y su posterior update, lo adapataré en visual el procedimiento y veré si se reduce tiempos
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