PDA

Ver la Versión Completa : Mejorar Velocidad Base de Datos


joanajj
09-05-2006, 20:35:00
Buenas tardes atodos, sabría alguien como puedo mejorar el acceso y muestra de los datos de un BD Access. Os explico.

Tengo un BD Access sobre Delphi 7 y accedo con Adotable, sin usar SQL, directamente con append, edit,locate, post, etc.

La base a ido creciendo y tiene como unos 8 o 9000 registros(le hago con frecuencia la compresión de los datos). Al hacer un por ej. Locate tarda como unos 5 segundos en posicionarse en la primera coincidencia, si cambio el indice para ordenar por otro campo, lo mismo, y la repera, se me ocurrió pulsar la tecla Fin para posicionarme en el último registro y tardó como 5 minutos en hacerlo. La pregunta es si sabe alguien como mejorar esto ,o si usando alguna base de datos alternativa se puede mejorar, teniendo en cuenta que pueda importar los datos desde la tabla Access hasta esa base nueva y que las modificaciones en el código fuente no sean demasiados engorrosas.

De ante mano gracias y un saludo...

amadis
09-05-2006, 21:53:32
Espero no desalentarte pero tengo ententido (puedo estar equivocado) que ese comportamiento es normal de access trabajado desde delphi.

Según había leido es como una traba para que los programadores no usen access desde lenguajes ajenos a microsoft.

Podrias migrar el access a Paradox. O bien pasarte a FireBird o InterBase

carriagada
09-05-2006, 22:51:19
No quiero ser pedante, pero te recomiendo lo mismo que el mensaje anterior; utiliza una base de datos en serio, no access, que es cualquier cosa menos una BD, bueno, en realidad para tener una base local y hogareña sirve, pero para trabajar en serio, ummmm.

Suerte.

waltergomez
09-05-2006, 23:31:35
Estoy de acuerdo con los comentarios anteriores.
Pero no siempre con cambiar la base de datos solucionamos el problema, y sabemos que los tiempos son tiranos.

Podes contemplar otras alternativas.

1) Reemplzar el locate por la ejecucion de un Query
2) Es necesario tener las 9000 filas siempre en el dataset ?, podrias implementar una forma distinta de obtencion de los datos, en lugar de hacer un simple active=true, solicitar los parametros desde hasta o lo que sea necesario y luego ejecutar un Query y mostrar el resultado.

Hay mas cosas pero la decicion es tuya.

Saludos,

Neftali [Germán.Estévez]
10-05-2006, 10:34:34
La base a ido creciendo y tiene como unos 8 o 9000...
...se me ocurrió pulsar la tecla Fin para posicionarme en el último registro y tardó como 5 minutos en hacerlo

Está claro que Access es una Base de Datos de escritorio, y no se puede pretender usarla en proyectos profesionales, pero lo que no es normal es que el recorrido de una tabla de 8000 registros tarde 5 minutos. Ahí hay algo mal.

En Delphi, trabajando con un fichero MDB y accediendolo con ADO, yo he trabajado con volúmenes mucho superiores a ese y funciona perfectamente.

...usando alguna base de datos alternativa se puede mejorar
Coincido en lo que han dicho, no todo se arregla diciendo "Cambia a FireBird/SQLServer que son Bases de Datos en Serio". Como te he comentado, no son normales esos tiempos, lo que significa que el problema no está en la Base de Datos.
Recorrer una tabla de Access con 30000 registros debe hacerse casi de forma inmediata y el locate igual.

¿Puedes poner algo de código del que estás utilizando? ¿Dar más detalles?

(1) ...ese comportamiento es normal de access trabajado desde delphi.
(2) ...Según había leido es como una traba para que los programadores no usen access desde lenguajes ajenos a microsoft.
(3) ...Podrias migrar el access a Paradox.

(1) En absoluto es un comportamiento normal. los Ficheros MDB de Jet4 (no confundir con Access que es un programa propietario para tratarlos) funcionan bien en local (al igual que lo puede hacer Paradox) siempre y cuando se usen correctamente y "no se les pida más de lo que son" (una Base de Datos de escritorio).

(2) No hay ninguna traba en utilizar Delphi+ADO+MDB; Es más, creo que a MS le debe interesar que mucha gente use sus ficheros MDB; Significa que algunos de éstos acabarán utilizado/comprando Access (propiedad de MS).

(3) Migrar una Base de Datos MDB+ADO a Paradox+BDE es como "dejar de comer Pan para comer tortas"; Dudo mucho que obtengas más rendimiento; Es más estoy casi seguro de que accediendo a MDB con ADO (acceso nativo) se obtiene más rendimiento que accediendo a Paradox a través del BDE; Aunque en definitiva son opciones muy similares; Si vas a cambiar, debes hacerlo a un SGBD (sigo pensando que no siempre todo se arregla así).

Antes de hacer cambios, yo revisaría:
(1) Cómo tienes definda la estructura de la Base de Datos. Sobre todo claves primarias, claves foráneas e índices sobre las tablas.
(2) Actualizate las MDAC a alguna de las últimas versiones.
(3) Repara y compacta la Base de Datos para asegurarte de que no tiene problemas. Si tienes dudas, crea un Base de Datos en balnco e importa la anterior.
(4) Revisa que tengas bien configurada la conexión en el ADOTable/ADOConection (usando Jet4)
(5) Revisa las propiedades CursorType de la conexión y del ADOTable.
(6) ¿Estás trabajando en Red? Si es así revisa que no tengas problemas de Red. Como te he dicho esos tiempos "denotan claramente" un problema (no son achacables a Access).
(7) Piensa en usar SQL para búsquedas en lugar de Locate. Revisa campos sobre los que usas locate para añadir índices.

Todo depende de qué tipo de proyecto estés haciendo:
* Local o en Red
* Monopuesto o Multipuesto
* Volumen de Datos/Tablas
* ...

Tal vez con más datos y algo de código te podamos ayudar más...

Un saludo

joanajj
10-05-2006, 14:14:26
Gracias por la rápida respuesta, todo lo que comentas lo tengo controlado exepto lo del cursor type, que realmente no tengo clara su función(nunca lo he usado) y con SQl no he probado. Si me puedes decir algo acerca de lo del cursor.
Es cierto ke 5 mtos. es mucho, a mí me pareció raro.

En cuanto al código, todo está normal, tengo clave primaria, uso índices, y por lo demás ya sabes, append, edit, post...

Saludos...

Neftali [Germán.Estévez]
10-05-2006, 15:56:04
Para tan pocos datos, el cursortype casi no tendrá efecto.
Lo que hace configurar como clClient es que al abrir la tabla, y abrir un cursor (por ejemplo en un DBGrid) los datos se traen completos al cliente, en cambio si se configura como clServer, trae los registros por bloques a medida que los va necesitando.
Pero como te he dicho, con ese volumen de registros, ni debería notarse.

roman
10-05-2006, 16:29:15
Depende como tenga montada la base. Si el archivo mdb está en una carpeta compartida en otra pc, entonces sí que puede notarse la diferencia. La red de Windows es extremadamente lenta y mover 8000 registros a través de ella a un mismo tiempo puede ser muy pesado.

// Saludos

Neftali [Germán.Estévez]
10-05-2006, 17:53:40
...Si el archivo mdb está en una carpeta compartida en otra pc, entonces sí que puede notarse la diferencia...

¡¡Pero si 8000 registros es una miseria?!! Estamos hablando de 5 minutos; Ni que el PC estuviera en Australia y tuvieran que traerlos 1 a 1 en bicicleta.
Sigo pensando que eso no va a cambiar nada, y si lo hace es indicativo (más aun) de que el problema está en otro sitio.

Independientemente de que pueda ser mejor o peor para el tráfico de red, pero eso no está bien (y no es por el CursorType).

8000 registros = 5 minuto
1600 registros = 1 minuto
27 registros = 1 segundo

¡¡¡Pero si yo escribo más rápido!!! :D:D:D

joanajj estaría bien que nos confirmaras si estás trabajando en red/local, qué tipo de red tienes, protocolo,...

¿Si estás trabajando en red? ¿Has realizado la misma prueba con la BD en local?

joanajj
10-05-2006, 19:41:31
Buenas a todos de nuevo. Aporto más datos:

- El equipo no trabaja en Red
- El equipo tiene menos de 6 meses
- Trabaja con Windows XP, OpenOffice y nada más. Aparte del la aplicación problemática.
- No tiene acceso a Internet y está libre de virus.

Supongo que esto lo pone todo más complicado.

Eso sí , un detalle, esa BD inicialmente estaba escrita en un formato diferente a Access, no recuerdo el nombre del lenguaje en el que fue hecha la aplicación anterior, era para Windows y necesitaba arrancar el software para luego abrir la aplicación, entonces al cambiar la aplicación y desarrollarla en Delphi hubo que exportar esos datos a dbf(ya que esa aplicación no exportaba a MDB), y desde Access importar de DBF A MDB. Por si sirve de algo.

Saludos...

mazinger
11-05-2006, 09:38:18
Hola joanajj, como tú, yo también trabajo con BD en MDB y accedo por Jet 4. Es cierto que es bastante lento en su funcionamiento general, pero en lo que más se me retrasa es:

1.- Abrir las tablas. Si tienen bastantes registros, por ejemplo más de 3000 se hace un poco lento, especialmente si tienes relaciones maestro/detalle,+
2.- Editar y guardar. Un solo registro no se nota, pero si haces varias actualizaciones, por ejemplo a través de un bucle, la cosa se demora bastante. Por ejemplo para actualizar 20 registros puede tardar 3/4 segundos.

Lo que no veo normal, por más que haya gente que lo diga así, es que recorrer una tabla de principio a fin te tarde más de un segundo. Y los locates son inmediatos. Al menos trabajando con una base de datos en el propio PC (creo que en red tampoco tarda tanto ni mucho menos)
En cualquier caso, comoo te comento el acceso es bastante lento, y por tanto he implementado SQL en todos los casos que he podido, aún así hay momentos en que tienes que utilizar el método post del ADOTable.

Prueba a utilizar el componente TBetterADODataSet (http://betterado.hit.bg/) que tal vez te mejore algo. Tambien tienes los componentes gratuitos KADAO y KAADO (http://kadao.dir.bg/). Pruebalos.

joanajj
11-05-2006, 13:58:06
Gracias mazinger, como veo no soy el único con ese problema. Estoy por pasarme a Firebird , exportar los datos y probar, a ver si mejora algo...
Aunque tendré que aprender a usar dichas base de datos.

Gracias...