Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Tablas planas (https://www.clubdelphi.com/foros/forumdisplay.php?f=20)
-   -   ADOTable y ACCESS lentos al cargar (https://www.clubdelphi.com/foros/showthread.php?t=58015)

Chogo 04-07-2008 21:25:03

ADOTable y ACCESS lentos al cargar
 
Hola.

Estoy usando access 2003 y ado en Delphi 7. corriendo en WinXP tengo un programa que ya tiene cierta cantidad de datos. pero veo que se pone muy lento en las maquinas cliente al cargar los adotable. el sistema corre en una red de cable utp y la distancia es pequeña solo son tres computadoras conectadas.

Eh estado viendo la propiedad maxrecords de los adotable para redusir el tiempo de carga. para que no me cargue todos lo registros. pero parece que no funciona esta propiedad.

Que pudeo hacer para mejor el rendimiento en la carga de los adotable

Caral 04-07-2008 21:42:50

Hola
Yo usaria un AdoQuery con TOP para limitar la cantidad de registros.
Saludos

poliburro 04-07-2008 21:48:06

Cita:

Empezado por Chogo (Mensaje 298342)
Hola.

Estoy usando access 2003 y ado en Delphi 7. corriendo en WinXP tengo un programa que ya tiene cierta cantidad de datos. pero veo que se pone muy lento en las maquinas cliente al cargar los adotable. el sistema corre en una red de cable utp y la distancia es pequeña solo son tres computadoras conectadas.

Eh estado viendo la propiedad maxrecords de los adotable para redusir el tiempo de carga. para que no me cargue todos lo registros. pero parece que no funciona esta propiedad.

Que pudeo hacer para mejor el rendimiento en la carga de los adotable


si tus tablas tienen cientos de miles de registros, nada, lo mejor es que uses querys

Chogo 04-07-2008 21:53:40

Cita:

Empezado por Caral (Mensaje 298345)
Hola
Yo usaria un AdoQuery con TOP para limitar la cantidad de registros.
Saludos

Gracias por tu pronta repuesta pero lo que pasa es que son como unos 40 adotables. No puedo cambiarlos a esta hora del partido.

Si hicera eso como haria con los formulario maestro-detalle los adoquery no estan diseñados para eso. habria que programar mas.

Chogo 04-07-2008 21:56:02

Cita:

Empezado por poliburro (Mensaje 298348)
si tus tablas tienen cientos de miles de registros, nada, lo mejor es que uses querys

La mas grande tiene 279,133 registros. ¿ creen que son demasidos registros para no usar Adotable?

Chogo 04-07-2008 21:57:57

La base de datos mide 100 Mb

poliburro 04-07-2008 23:28:16

Cita:

Empezado por Chogo (Mensaje 298354)
La mas grande tiene 279,133 registros. ¿ creen que son demasidos registros para no usar Adotable?


Pero claro que son demasiados para usar un AdoTable. Imaginate, estás cargando 100 megas en memoria.

modifica tu aplicación a AdoQuery

Al González 05-07-2008 06:51:48

¡Hola!

No te preocupes, lo que experimentas ahora es parte de un proceso cotidiano de aprendizaje en el que terminas comprendiendo por qué muchas veces es mejor utilizar bases de datos cliente-servidor y por qué en la mayoría de los casos no tiene lógica alguna leer de la base de datos todos los registros de una tabla. :)

La lentitud que presenta ahora tu programa es normal debido a la gran cantidad de bytes que estás "jalando" de la base de datos (los procesadores y los cables de red tienen sus límites ;)).

Cita:

Empezado por Chogo (Mensaje 298354)
La mas grande tiene 279,133 registros. ¿ creen que son demasidos registros para no usar Adotable?

Depende para qué uses ese componente tabla. Si es para imprimir un listado de todos esos 279133 registros, o bien para exportar, vaciar o transmitir toda la tabla a donde se requiere por parte de otro sistema, podría tener sentido. Pero si sólo la abres para captura y, durante dicha sesión, tu aplicación emplea solamente un porcentaje menor de todos esos registros, cargar en memoria esa gran mayoría que no se utiliza para nada es un enorme desperdicio de recursos (tiempo).

Debes acostumbrarte a ver a las bases de datos como un almacén y no como un remolque, no puedes andar llevando la bodega de aquí para allá, como si nada. Las aplicaciones deben tomar de la base de datos solamente la información que requieren, grabando en ellas resultados de sus procesos.

Para permitirle al usuario navegar en una tabla y capturar información en ella, generalmente hago una apertura de la misma trayéndome tan solo las últimas 100 filas que fueron modificadas. Y cuando el usuario desea ver otros registros, le proporciono mecanismos de búsqueda que utilizan un "data set" alterno parametrizado e integran los resultados al listado que ya tengo abierto. Para esto es importante utilizar componentes que te permitan discriminar registros en la extracción de la base de datos que realizan internamente. Casi* ningún componente "Table" te permite hacer esa discriminación, por lo que usualmente se aconseja la alternativa de los componentes "Query", ya que en estos colocas una sentencia SQL Select que lleva condiciones en su cláusula Where para "sacar" de la base de datos sólo ciertos registros.

Cita:

Empezado por Chogo (Mensaje 298352)
Gracias por tu pronta repuesta pero lo que pasa es que son como unos 40 adotables. No puedo cambiarlos a esta hora del partido.

Si hicera eso como haria con los formulario maestro-detalle los adoquery no estan diseñados para eso. habria que programar mas.

Todo error de diseño tiene sus consecuencias, Chogo. Pero para eso están estos foros ;). Vayamos por partes:

Por un lado los componentes Query pueden establecerse en relaciones maestro-detalle. En la Red y en estos mismos foros podrás encontrar muchos ejemplos.

Por otra parte, si tu aplicación corresponde a las características típicas de un programa de gestión, es muy probable que sólo unas cuantas tablas tengan miles de registros (¿o acaso las 40 almacenan casi 300 mil?). Podrías empezar por convertir a TADOQuery los cuatro o cinco TADOTable más críticos, como medida de alivio transitorio. Después tendrás más tiempo para revisar tu proyecto a profundidad y plantearte seriamente el usar una base de datos más adecuada (cliente-servidor, como Firebird, por ejemplo).

Espero te resulte orientadora mi aportación.

Un abrazo selectivo.

Al González. :)

*Por mi experiencia con los componentes IBX, sé que TIBTable maneja la carga de registros de manera eficiente al establecer un valor en su propiedad Filter antes de la apertura (con Filtered en True, desde luego). Internamente se ejecuta una consulta Select con cláusula Where, donde ésta lleva como condiciones el texto de la propiedad Filter. No conozco a fondo el componente TADOTable, pero dudo que haga lo mismo.

Chogo 08-07-2008 20:11:40

Cita:

Empezado por Al González (Mensaje 298428)
¡Hola!

No te preocupes, lo que experimentas ahora es parte de un proceso cotidiano de aprendizaje en el que terminas comprendiendo por qué muchas veces es mejor utilizar bases de datos cliente-servidor y por qué en la mayoría de los casos no tiene lógica alguna leer de la base de datos todos los registros de una tabla. :)

Realmente si usare una base de datos cliente-servidor para mis proximos proyectos y por otro lado, si necesito hacer unos arreglos de diseño de mi programa:(. esto me paso por no tener la experiencia necesaria. aveces los manuales de principiantes no te abren los ojos a problemas futuros como el rendimiento de la aplicacion. esto prueba que la experiencia es comprada.


La franja horaria es GMT +2. Ahora son las 23:59:09.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi