Foros del Web » Programación para mayores de 30 ;) » .NET »

Lentitud al crecer los registros

Estas en el tema de Lentitud al crecer los registros en el foro de .NET en Foros del Web. Hola gente del foro, una aplicación winforms que hice hace tiempo, está empezando a funcionar con lentitud a medida que han ido creciendo los registros. ...

  #1 (permalink)  
Antiguo 01/06/2006, 05:49
Avatar de moNTeZIon  
Fecha de Ingreso: enero-2005
Ubicación: Lliçà de Munt - BCN
Mensajes: 1.625
Antigüedad: 19 años, 3 meses
Puntos: 9
Lentitud al crecer los registros

Hola gente del foro,
una aplicación winforms que hice hace tiempo, está empezando a funcionar con lentitud a medida que han ido creciendo los registros. Hasta que ha llegado al punto de tardar como 1 minuto el proceso de guardar cambios. Pero este proceso no hace más que un update del dataset y un fill para volverlo a recargar.

Les dejo el codigo de esa parte, y les pido sugerencias acerca de como tratar esto, para mejorar los tiempos de respuesta. Que empiezan a ser un poco exagerados.

Código:
Private Sub btnGuardar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnGuardar.Click
    Me.BindingContext(miDataSet, "Mantenimientos").EndCurrentEdit()
    If miDataSet.HasChanges Then
        GuardarCambios_miDataSet()
    End If
End Sub

Private Function GuardarCambios_miDataSet() As Boolean
    Try
        Form_IsLoad = False
        Dim CeldaActual As DataGridCell = dgMantenimientos.CurrentCell
        Dim objMantenimientos As New miNameSpace.MantenimientosDB
        daMantenimientos.InsertCommand = objMantenimientos.DameComandoActualizacion("Insert")
        daMantenimientos.UpdateCommand = objMantenimientos.DameComandoActualizacion("Update")
        daMantenimientos.DeleteCommand = objMantenimientos.DameComandoActualizacion("Delete")
        daMantenimientos.Update(miDataSet, "Mantenimientos")
        miDataSet.Tables("Mantenimientos").Clear()
        daMantenimientos.Fill(miDataSet, "Mantenimientos")
        dgMantenimientos.Focus()
        dgMantenimientos.CurrentCell = CeldaActual
        Return True
    Catch eX As DBConcurrencyException
        MessageBox.Show(ex.Message, "Error de Concurrencia")
        Return False
    Catch eX As Exception
        MessageBox.Show(eX.Message, "Error")
        Return False
    Finally
        Form_IsLoad = True
    End Try
End Function
Igual muevo mucha información para arriba y para abajo innecesariamente. Gracias por ofrecerme sus soluciones.
Saludos cordiales.
__________________
..:: moNTeZIon ::..
  #2 (permalink)  
Antiguo 05/06/2006, 11:18
Avatar de moNTeZIon  
Fecha de Ingreso: enero-2005
Ubicación: Lliçà de Munt - BCN
Mensajes: 1.625
Antigüedad: 19 años, 3 meses
Puntos: 9
Hola de nuevo.
Vamos chicos. Nadie puede echarme una mano? Seguro que más de uno habeis hecho aplicaciones WinForms mucho más complejas.
Es que no se por donde empezar. El codigo va lento, però en teoría, eso es lo que se debe hacer para guardar cambios, no? Update y Fill.
Gracias a todos.
Saludos y disculpad que haya revivido el post.
__________________
..:: moNTeZIon ::..
  #3 (permalink)  
Antiguo 12/06/2006, 10:09
Avatar de moNTeZIon  
Fecha de Ingreso: enero-2005
Ubicación: Lliçà de Munt - BCN
Mensajes: 1.625
Antigüedad: 19 años, 3 meses
Puntos: 9
Hola!
De nuevo ando reviviendo el mismo post, en busca de vuestros consejos.
Alguna alma samaritana... que vea algún terrible error de planteamiento en ese codigo.
Salud!
__________________
..:: moNTeZIon ::..
  #4 (permalink)  
Antiguo 12/06/2006, 10:30
Avatar de freegirl
Colaborador
 
Fecha de Ingreso: octubre-2003
Ubicación: Catalonia
Mensajes: 4.334
Antigüedad: 20 años, 7 meses
Puntos: 156
Hola,

yo es que no trabajo de esa forma, por lo cual no puedo mucho ayudarte.

Yo lo que hago es insertar, actualizar, eliminar, etc. directamente atacando a la BD, sin hacer las acciones con el dataset.

Vamos, lo que yo hago, por ejemplo:

Cita:
conn.open
cmd.connection=conn
cmd.commandtext="update clientes set cliente=@cliente,poblacion=@poblacion where idCli=1"
cmd.parameters.add("@cliente",txtCliente.text)
cmd.parameters.add("@poblacion",txtPob.text)
cmd.executeNonquery
cmd.parameters.clear
conn.close
De esta forma no tendrías ningún problema, por muchos registros que tengas.


saludos!
  #5 (permalink)  
Antiguo 12/06/2006, 11:09
Avatar de moNTeZIon  
Fecha de Ingreso: enero-2005
Ubicación: Lliçà de Munt - BCN
Mensajes: 1.625
Antigüedad: 19 años, 3 meses
Puntos: 9
mmmm... ok, entiendo entonces que el modelo Update + Fill queda un poco obsoleto en caso que crezcan los registros?
Quisiera saber si realmente es eso que pregunto, o si realmente estoy usando mal el modelo y por eso la demora...
Cuando habia 100 registro todo iba perfecto y con 200 y con 300... Pero ahora con 1500 - 2000 registros, la cosa va fatal..
Pido más soluciones, si las hay, please..
Saludos cordiales.
__________________
..:: moNTeZIon ::..
  #6 (permalink)  
Antiguo 12/06/2006, 14:14
Avatar de xknown  
Fecha de Ingreso: diciembre-2004
Ubicación: Cusco - Perú
Mensajes: 2.248
Antigüedad: 19 años, 4 meses
Puntos: 7
Creo que primero debes determinar donde está el problema, si al momento de insertar o al momento de mostrar los datos (digo esto porque ejecutas el método Fill luego de actualizar el DataSet)...

Saludos
__________________
Alex Concha
Buayacorp - Programación y Diseño
  #7 (permalink)  
Antiguo 13/06/2006, 05:53
Avatar de moNTeZIon  
Fecha de Ingreso: enero-2005
Ubicación: Lliçà de Munt - BCN
Mensajes: 1.625
Antigüedad: 19 años, 3 meses
Puntos: 9
Hola de nuevo.
Bien he estado probano un poco, depurando la aplicación paso a paso, y veo que la linea daMantenimientos.Update(miDataSet, "Mantenimientos") va rápido. En seguida se queda esperando en la siguiente linea.
En cambio la linea daMantenimientos.Fill(miDataSet, "Mantenimientos") si que se demora un buen rato hasta quedarse esperando en la siguente linea.
Imagino entonces que el problema será el Fill?
Pero bien, como puedo optimizar un Fill? O me estoy perdiendo algo...

Una cosa más.
Cita:
Iniciado por xknown
(digo esto porque ejecutas el método Fill luego de actualizar el DataSet)
Esto es lo típico no, xknown?? Ejecutar un Fill luego de actualizar el Dataset, para que recoja los cambios hecho por otros usuarios y los mios, y así poder volver a tener la info actualizada. A ver si el problema lo tengo en los conceptos...

Thanks man
__________________
..:: moNTeZIon ::..
  #8 (permalink)  
Antiguo 13/06/2006, 12:44
Avatar de freegirl
Colaborador
 
Fecha de Ingreso: octubre-2003
Ubicación: Catalonia
Mensajes: 4.334
Antigüedad: 20 años, 7 meses
Puntos: 156
si no me equivoco, para poder ver los cambios, con el acceptchanges ya te valdría, y así no haría falta hacer el fill después del Update.

Cita:
miDataset.AcceptChanges
No sé, pruébalo.... y ya dirás si te ha funcionado.


saludos!
  #9 (permalink)  
Antiguo 14/06/2006, 01:43
Avatar de moNTeZIon  
Fecha de Ingreso: enero-2005
Ubicación: Lliçà de Munt - BCN
Mensajes: 1.625
Antigüedad: 19 años, 3 meses
Puntos: 9
Hola freegirl,
Si hago AcceptChanges, que alguien me corrija si me equivoco, le estoy diciendo al DataSet que aunque tenga cambios, los acepte y no los tome como cambios, creo. De esta forma si le preguno ".HasChanges" me dirá que no, porqué le hice el AcceptChanges. Alguien puede confirmar esto?
Porqué si es así, entonces no estamos recuperando los cambios hechos por otros usuarios durante ese tiempo, ya que no estamos ni accediendo a la BD, según lo veo...
De todas formas, iria perfecto un fragmento de código donde muestres eso freegirl.
Muchas gracias y saludos!
__________________
..:: moNTeZIon ::..
  #10 (permalink)  
Antiguo 14/06/2006, 03:59
Avatar de freegirl
Colaborador
 
Fecha de Ingreso: octubre-2003
Ubicación: Catalonia
Mensajes: 4.334
Antigüedad: 20 años, 7 meses
Puntos: 156
Hola!

si el acceptchanges lo haces después del Update, no tendrías ningún problema. Ya te va bien que después de guardar los cambios te diga que no hay cambios,no? Ya que el procedimiento "guardar_cambios" sólo lo llama en el caso que haya cambios.

Vamos, nunca hagas un AcceptChanges antes de hacer el update, porque entonces si que no te va a guardar nada.

La cosa debería quedar así:

Cita:
........

daMantenimientos.UpdateCommand = objMantenimientos.DameComandoActualizacion("Update ")
daMantenimientos.DeleteCommand = objMantenimientos.DameComandoActualizacion("Delete ")
daMantenimientos.Update(miDataSet, "Mantenimientos")
miDataSet.acceptChanges

.....


Salvo mejor criterio, claro.


saludos!
  #11 (permalink)  
Antiguo 14/06/2006, 04:04
Avatar de freegirl
Colaborador
 
Fecha de Ingreso: octubre-2003
Ubicación: Catalonia
Mensajes: 4.334
Antigüedad: 20 años, 7 meses
Puntos: 156
si no te refrescara la Grid, después del AcceptChanges puedes hacer lo de:

Cita:
datagrid1.SetDataBindings (midataset, "mantenimientos")

saludos!
  #12 (permalink)  
Antiguo 14/06/2006, 05:30
Avatar de moNTeZIon  
Fecha de Ingreso: enero-2005
Ubicación: Lliçà de Munt - BCN
Mensajes: 1.625
Antigüedad: 19 años, 3 meses
Puntos: 9
Si freegirl, pero creo que no nos entendimos con el detalle clave.
Si lo dejo como cometas:
Código:
daMantenimientos.UpdateCommand = objMantenimientos.DameComandoActualizacion("Update ")
daMantenimientos.DeleteCommand = objMantenimientos.DameComandoActualizacion("Delete ")
daMantenimientos.Update(miDataSet, "Mantenimientos")
miDataSet.acceptChanges
Qué ocurre si mi compañero ha dado un registro de alta? Por mucho que refresque el datagrid no lo voy a ver, porqué todavía no existe en mi dataset. Hay que volver a viajar a la BD para recuperar esos registros nuevos.
Esto mismo lo puedes aplicar también a registros que se hayan eliminado o modificado... Si no vuelvo a cargar los registros de la BD no se ven esos cambios.... NO ??? Es que ya estoy empezando a tener mis dudas...

Por eso lo que intento, es omitir el AcceptChanges ya que no me sirve de nada si le voy a hacer un Clear() para volver a cargar todo con un Fill()
__________________
..:: moNTeZIon ::..
  #13 (permalink)  
Antiguo 14/06/2006, 07:50
Avatar de freegirl
Colaborador
 
Fecha de Ingreso: octubre-2003
Ubicación: Catalonia
Mensajes: 4.334
Antigüedad: 20 años, 7 meses
Puntos: 156
perdón, se me escapó que la aplicación la ejecutais varios usuarios a la vez...Claro, entonces lo que te digo no te sirve.

Pero cuantos registros tienes, más o menos, en tu dataset cuando te va lento?



saludos!
  #14 (permalink)  
Antiguo 14/06/2006, 09:27
Avatar de moNTeZIon  
Fecha de Ingreso: enero-2005
Ubicación: Lliçà de Munt - BCN
Mensajes: 1.625
Antigüedad: 19 años, 3 meses
Puntos: 9
Cita:
Iniciado por moNTeZIon
Cuando habia 100 registro todo iba perfecto y con 200 y con 300... Pero ahora con 1500 - 2000 registros, la cosa va fatal..
Más o menos
__________________
..:: moNTeZIon ::..
  #15 (permalink)  
Antiguo 15/06/2006, 10:43
Avatar de freegirl
Colaborador
 
Fecha de Ingreso: octubre-2003
Ubicación: Catalonia
Mensajes: 4.334
Antigüedad: 20 años, 7 meses
Puntos: 156
pues no sé si habrá alguna alternativa, pero claro son muchos registros y, quieras o no, eso consume. Yo te recomendaría llenar el dataset con los registros que sean necesarios. Utiliza algún tipo de filtro predeterminado para que no te liste todos los registros. Luego, si el usuario quiere listar o hacer una búsqueda de todos los registros, pues ya es otra cosa...le sacas el típico mensajito con la 'progressbar', para que sepa que se está procesando la búsqueda y no que la aplicación se ha quedado colgada.

Por ahora sólo se me ocurre eso.

Si encuentras otra solución, ya nos contarás.


saludos!
  #16 (permalink)  
Antiguo 15/06/2006, 11:18
Avatar de moNTeZIon  
Fecha de Ingreso: enero-2005
Ubicación: Lliçà de Munt - BCN
Mensajes: 1.625
Antigüedad: 19 años, 3 meses
Puntos: 9
Por supuesto que la compartiré. Igualmente, quedo a la espera de más opiniones al respecto.
1000 - 2000 registros, si, son bastantes, pero creo que no es ninguna exageracion tampoco... no? Almenos para que se tire 20-25 segundos cargando...
Saludos a todos.
__________________
..:: moNTeZIon ::..
  #17 (permalink)  
Antiguo 16/06/2006, 03:23
Avatar de freegirl
Colaborador
 
Fecha de Ingreso: octubre-2003
Ubicación: Catalonia
Mensajes: 4.334
Antigüedad: 20 años, 7 meses
Puntos: 156
Depende de las columnas que tenga tu dataset y los tipos de datos que almacenes... también depende de las características del PC.... Todo influye. Más o menos que caracteristicas tiene el pc dónde va lento?


saludos!
  #18 (permalink)  
Antiguo 16/06/2006, 04:42
Avatar de moNTeZIon  
Fecha de Ingreso: enero-2005
Ubicación: Lliçà de Munt - BCN
Mensajes: 1.625
Antigüedad: 19 años, 3 meses
Puntos: 9
mmm... ahora mismo no llego a tanta info, pero bueno, creo que es una buena máquina... No es de esos equipos antiguos, debe ser un P4 y tal...
Columnas, pues no muchas la verdad. Y ninguna es de tipo MEMO ni BLOB ni capos grandes. Estoy mostrando unas 8 ò 10 olumnas.. Si ya te digo, no le veo ninguna exageración a la cantidad de datos que estoy trayendo...
Debería ir más rápido a recuperar 2000 registros, creo yo..
Si alguien me dice que si, que empiezan a ser demasiados, lo dejo aqui el tema. Pero creo que tampoco son demasiados registros.

Y nada, si me dicen que el código está bien pues nada. Porqué nadie me ha dicho que haya visto nada raro.. Yo creí que verían algo en el código que no hacía bien.. Pero si estos son los límites, tendremos que empezar a filtrar más registros.
En fin.
Saludos freegirl, y gracias por tu tiempo.
__________________
..:: moNTeZIon ::..
  #19 (permalink)  
Antiguo 16/06/2006, 07:16
Avatar de RsOfT  
Fecha de Ingreso: marzo-2002
Ubicación: InterNET
Mensajes: 1.121
Antigüedad: 22 años, 1 mes
Puntos: 7
moNTeZIon, podría empezar a utilizar Top en tus select.
Por otro lado, la velocidad depende también de la base de datos que utilices y la cantidad de usuarios conectados a ella.

Si estás utilizando microsoft access con varios usuarios, eso es para morirse, tengo una aplicación con access y cuando hay varios usuarios utilizándola es un suero de miel de abeja, jeje.

__________________
.::RsOfT::.
--El que se aferra a lo conocido, nunca conocerá lo desconocido--
--Es intentando lo imposible como se realiza lo posible--
--Es de pésimo gusto contentarse con algo mediocre cuando lo excelente está a nuestro alcance--
  #20 (permalink)  
Antiguo 19/06/2006, 11:15
Avatar de moNTeZIon  
Fecha de Ingreso: enero-2005
Ubicación: Lliçà de Munt - BCN
Mensajes: 1.625
Antigüedad: 19 años, 3 meses
Puntos: 9
Ah. Ok. La verdad es que no es muy común que la utilicen dos a la vez, pero si es posible.
Luego, también está hecho en Access, así que puede influir como dices. También me creo que aunque sea un solo usuario me vea limitado por ser Access, igualmente.
Y luego, pues si, tendré que explicarle a esta mujer que empiezan a ser muchos registros y tendremos que filtrar por algún criterio más.

Lo que me comentas del Top, podrías acabar de comentarme esa solucion? O sea, si hago un TOP 500... Cuando vaya bajando y llegue al registro 500... Qué hago?

Porqué.... Se suele implementar paginación en aplicaciones Windows Forms, igual que se hace con Web Forms?? Yo creia que no porqué iban sobrados, pero igual es buena solución, no?

Saludos.
__________________
..:: moNTeZIon ::..
  #21 (permalink)  
Antiguo 19/06/2006, 11:25
Avatar de RsOfT  
Fecha de Ingreso: marzo-2002
Ubicación: InterNET
Mensajes: 1.121
Antigüedad: 22 años, 1 mes
Puntos: 7
Cita:
Originalmente escrito por: moNTeZIon.
Lo que me comentas del Top, podrías acabar de comentarme esa solucion? O sea, si hago un TOP 500... Cuando vaya bajando y llegue al registro 500... Qué hago?
Bueno, para resolver ese problema, podrías poner un TextBox que indique la cantidad de registro que trae la aplicación y que el usuario pueda cambiarlo si así lo desea.

Por otro lado, nunca he paginado en una aplicación windows application, pero entiendo que el concepto debe ser igual, lo que no creo es que el Grid de Windows Application venga preparado para paginar, por lo que tendrías que programarlo tu mismo.

__________________
.::RsOfT::.
--El que se aferra a lo conocido, nunca conocerá lo desconocido--
--Es intentando lo imposible como se realiza lo posible--
--Es de pésimo gusto contentarse con algo mediocre cuando lo excelente está a nuestro alcance--

Última edición por RsOfT; 19/06/2006 a las 11:40
  #22 (permalink)  
Antiguo 19/06/2006, 13:01
Avatar de freegirl
Colaborador
 
Fecha de Ingreso: octubre-2003
Ubicación: Catalonia
Mensajes: 4.334
Antigüedad: 20 años, 7 meses
Puntos: 156
Hombre si Access ya no puede con 2000 registros...Depene de muchos factores, entre los que si hay muchos usuarios y también los tipos de consulta que hagas...Pero si dices que tampoco es común que estén dos a la vez. Es que 2000 tampoco son muchos para que Access se ahogue.

Yo trabajo mucho con Access y con más de un usuario a la vez, y por ahora no tengo problemas de lentitud (sólo falta que diga esto para que me muera listando registros jeje ...así que voy tocar madera).

Una solución como bien dicen es paginar tu datagrid o bien créate un filtro..

Otra cosa que se me ocurre es que los adapters a veces son más lentos, por lo cual podrías crearte un datatable y llenarlo con un reader.

Esto es cuestión de probar. Así podrás ver que es realmente lo que te da problemas.


saludos!
  #23 (permalink)  
Antiguo 05/07/2006, 03:41
Avatar de freegirl
Colaborador
 
Fecha de Ingreso: octubre-2003
Ubicación: Catalonia
Mensajes: 4.334
Antigüedad: 20 años, 7 meses
Puntos: 156
Montezion, al final como lo solucionaste?


saludos!
  #24 (permalink)  
Antiguo 05/07/2006, 08:44
Avatar de moNTeZIon  
Fecha de Ingreso: enero-2005
Ubicación: Lliçà de Munt - BCN
Mensajes: 1.625
Antigüedad: 19 años, 3 meses
Puntos: 9
Hola freegirl,
Mira, ha pasado un mes desde que hice el primer post, desde aquel dia que me llamó la mujer para comentarme que le empezaba a ir lento el programa.
La verdad es que no he vuelto a hablar con ella, a parte que voy cargadísimo de curro. Tengo pendiente una reunión con ella, en la que le comentaré las posibles soluciones que podemos darle al problema, y que ella decida.
Cuando sea, si llega a ser, ya te comento como acabó la historia.
Un saludo freegirl!
P.S.: De todas formas, ya que has revivido el post y vuelve a estar por arriba, quedo abierto a cualquier otra opinión al respecto.
__________________
..:: moNTeZIon ::..
  #25 (permalink)  
Antiguo 05/07/2006, 10:47
 
Fecha de Ingreso: mayo-2004
Ubicación: Guadalajara, Jalisco, México
Mensajes: 724
Antigüedad: 20 años
Puntos: 6
Que osado está tu codigo montezion...

leete "patrones en .NET"
http://www.willydev.net/descargas/prev/Patrones.Aspx

para que aprendas a como usar capas (n tiers) en .NET

Saludos
  #26 (permalink)  
Antiguo 05/07/2006, 18:18
Avatar de moNTeZIon  
Fecha de Ingreso: enero-2005
Ubicación: Lliçà de Munt - BCN
Mensajes: 1.625
Antigüedad: 19 años, 3 meses
Puntos: 9
Gracias Stream!
__________________
..:: moNTeZIon ::..
  #27 (permalink)  
Antiguo 06/07/2006, 08:17
 
Fecha de Ingreso: mayo-2004
Ubicación: Guadalajara, Jalisco, México
Mensajes: 724
Antigüedad: 20 años
Puntos: 6
moNTeZIon, si, de hecho es más recomendable utilizar el top en el select, obviamente si te traes una cantidad exajerada de registros tu aplicacion se verá afectada en el performance... igual puedes poner un progressbar q le diga al cliente que se estan cargando... y poner un grid con paginacion para mostrar los datos.. nose.. ponle de 50 en 50.. así funcionaria más rapido...
  #28 (permalink)  
Antiguo 06/07/2006, 10:05
Avatar de moNTeZIon  
Fecha de Ingreso: enero-2005
Ubicación: Lliçà de Munt - BCN
Mensajes: 1.625
Antigüedad: 19 años, 3 meses
Puntos: 9
Si, me quedaré con alguna de estas soluciones. Por no rehacer demasiado un código que hice hace ya bastante tiempo.
Me quedo con el tema de los patrones para mi conocimiento.
Sabes de algun otro sitio que te haya servido para el tema de los n-tiers, a parte del libro que referencia el articulo que pusiste?
Saludos!
__________________
..:: moNTeZIon ::..
  #29 (permalink)  
Antiguo 26/07/2006, 08:56
Avatar de freegirl
Colaborador
 
Fecha de Ingreso: octubre-2003
Ubicación: Catalonia
Mensajes: 4.334
Antigüedad: 20 años, 7 meses
Puntos: 156
te dejo un ejemplo para paginar un datagrid en Winforms, por si te sirve.

Al final yo también lo voy implementar en mis programas.

http://support.microsoft.com/kb/305271/es


saludos!
  #30 (permalink)  
Antiguo 27/07/2006, 01:34
Avatar de moNTeZIon  
Fecha de Ingreso: enero-2005
Ubicación: Lliçà de Munt - BCN
Mensajes: 1.625
Antigüedad: 19 años, 3 meses
Puntos: 9
Que bueno.
Gracias Freegirl!
__________________
..:: moNTeZIon ::..
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 04:33.