Actualizacion artículos: 100.000 líneas y rendimiento

23/11/2007 - 09:14 por Gonzalo Rodríguez Carrera | Informe spam
Hola grupo.

Tengo un problemilla (otro más) :P .

Tengo que realizar un programa de actualización.
Durante el proceso se ralizan una serie de operaciones (bastante
complicadas, no podría hacerlas en el lado del servidor de datos) para
actualizar unos 100.000 artículos. Mi problema radica en el
rendimiento, que por supuesto se me va al sótano.
Actualmente cargo un datatable y aún así tarda muchísimo en realizar
la carga (antes de recorrerlo y operar)
¿a alguien se le ocurre una idea?

Ah. Ya se me olvidaba, trabajo en C# en Windows Forms.

Gracias por adelantado a todo el mundo.

Preguntas similare

Leer las respuestas

#1 Pablo Roca
23/11/2007 - 11:23 | Informe spam
¿Que base de datos utilizas?


Saludos,

Pablo Roca
La Coruna - Spain
http://www.portalfox.com
Respuesta Responder a este mensaje
#2 Alberto Poblacion
23/11/2007 - 11:32 | Informe spam
"Gonzalo Rodríguez Carrera" wrote in message
news:
Tengo que realizar un programa de actualización.
Durante el proceso se ralizan una serie de operaciones (bastante
complicadas, no podría hacerlas en el lado del servidor de datos) para
actualizar unos 100.000 artículos. Mi problema radica en el
rendimiento, que por supuesto se me va al sótano.
Actualmente cargo un datatable y aún así tarda muchísimo en realizar
la carga (antes de recorrerlo y operar)
¿a alguien se le ocurre una idea?



Es una barbaridad cargar 100.000 registros en un DataSet (como ya has
notado). Para tratar un número tan grande de registros, es mejor que uses un
DataReader y los vayas procesando uno por uno.
Con el DataReader, traes 1 registro, lo examinas para calcular los
cambios necesarios, y grabas esos cambios usando un UPDATE en un Command con
el método ExecuteNonQuery. Necesitarás usar una segunda conexión para enviar
el update, ya que la que usaste para el datareader se mantiene bloqueada
mientras el datareader está abierto (a no ser que uses MARS - pero esto
suele perjudicar el rendimiento).
Si quieres acelerar el proceso al máximo, agrupa los updates en un lote
de sentencias (basta con que los concatenes en un string), y ejecuta el lote
cuando tenga varios updates (por ejemplo, cada 100).
Respuesta Responder a este mensaje
#3 Pablo Roca
23/11/2007 - 12:40 | Informe spam
"Alberto Poblacion"
escribió en el mensaje news:
Es una barbaridad cargar 100.000 registros en un DataSet (como ya has
notado). Para tratar un número tan grande de registros, es mejor que uses
un DataReader y los vayas procesando uno por uno.



Incluso con un DataReader me parece demasiado.

Si tiene una base de datos medianamente decente (SQL Server o similar), yo
lo haria con un procedimiento almacenado en la parte de la base de datos.

Gonzalo puedes detallar un poco .. que calculos tienes que hacer?


Saludos,

Pablo Roca
La Coruna - Spain
http://www.portalfox.com
Respuesta Responder a este mensaje
#4 principiante
23/11/2007 - 12:54 | Informe spam
Si es un proceso que lo harás solo una vez, como me imagino es, pues
simplemente trata de hacerlo en una hora que no sea de mucho tráfico en la
red.
Como te dice Pablo tambien evalua a hacerlo dentro del propio servidor por
T-SQL si es posible.

Jose TH

"Gonzalo Rodríguez Carrera" escribió en el mensaje
news:
Hola grupo.

Tengo un problemilla (otro más) :P .

Tengo que realizar un programa de actualización.
Durante el proceso se ralizan una serie de operaciones (bastante
complicadas, no podría hacerlas en el lado del servidor de datos) para
actualizar unos 100.000 artículos. Mi problema radica en el
rendimiento, que por supuesto se me va al sótano.
Actualmente cargo un datatable y aún así tarda muchísimo en realizar
la carga (antes de recorrerlo y operar)
¿a alguien se le ocurre una idea?

Ah. Ya se me olvidaba, trabajo en C# en Windows Forms.

Gracias por adelantado a todo el mundo.
Respuesta Responder a este mensaje
#5 Gonzalo Rodríguez Carrera
23/11/2007 - 13:07 | Informe spam
Una confederacion (o algo asi) de farmacias me entrega un Access 2000
con los datos a actualizar y el programa de las farmacias asociadas a
dicho organismo está en SQLServer 2005.

El problema surge solo en una tabla de 102.000 registros
aproximadamente y 38 columnas, ya que el resto es literalmente "copiar-
pegar" y lo hago desde sql server con OpenDataSource() en una serie de
Select Into.

Por detallar más, las operaciones de dicha tabla son por un lado
logico/matemáticas y por otro lectura de ficheros planos, asi que no
veo como usar un procedimiento almacenado.

Hasta ahora mis pruebas me llevan bastante al consejo ofrecido por
Alberto Población, y bueno, sigue siendo un proceso algo lento, pero
algo ha mejorado ya algo en rendimiento.

También, y os pido vuestra opinión, lo he cargado en un segundo hilo
(backgroundworker) para no colapsar todo, y así mientras puedo
"entretener" al usuario con una especie de "diapositivas" con las
novedades de la nueva versión.

Eso si, y desde ya, gracias a todos por vuestro interés.
Gonzalo Rodríguez Carrera
Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida