Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Conexión con bases de datos
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Conexión con bases de datos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 09-05-2006
joanajj joanajj is offline
Miembro
 
Registrado: jul 2003
Posts: 144
Poder: 21
joanajj Va por buen camino
Mejorar Velocidad Base de Datos

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...
Responder Con Cita
  #2  
Antiguo 09-05-2006
amadis amadis is offline
Miembro
 
Registrado: may 2005
Ubicación: San José, Colón, Entre Ríos, Argentina
Posts: 315
Poder: 19
amadis Va por buen camino
Thumbs up No quiero ser pesimista

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
Responder Con Cita
  #3  
Antiguo 09-05-2006
carriagada carriagada is offline
Registrado
 
Registrado: ene 2006
Posts: 4
Poder: 0
carriagada Va por buen camino
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.
Responder Con Cita
  #4  
Antiguo 09-05-2006
Avatar de waltergomez
waltergomez waltergomez is offline
Miembro
 
Registrado: may 2006
Posts: 202
Poder: 18
waltergomez Va por buen camino
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,
Responder Con Cita
  #5  
Antiguo 10-05-2006
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.275
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Cita:
Empezado por joanajj
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.

Cita:
Empezado por joanajj
...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?

Cita:
Empezado por amadis
(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
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.

Última edición por Neftali [Germán.Estévez] fecha: 10-05-2006 a las 10:36:40.
Responder Con Cita
  #6  
Antiguo 10-05-2006
joanajj joanajj is offline
Miembro
 
Registrado: jul 2003
Posts: 144
Poder: 21
joanajj Va por buen camino
Gracias por la respuesta

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...
Responder Con Cita
  #7  
Antiguo 10-05-2006
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.275
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
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.
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #8  
Antiguo 10-05-2006
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
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
Responder Con Cita
  #9  
Antiguo 10-05-2006
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.275
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Cita:
Empezado por roman
...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!!!

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?
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #10  
Antiguo 10-05-2006
joanajj joanajj is offline
Miembro
 
Registrado: jul 2003
Posts: 144
Poder: 21
joanajj Va por buen camino
Aporto más datos

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...
Responder Con Cita
  #11  
Antiguo 11-05-2006
Avatar de mazinger
mazinger mazinger is offline
Miembro
 
Registrado: jul 2004
Ubicación: Zamora
Posts: 85
Poder: 20
mazinger Va por buen camino
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.
__________________
Visita mi página (en construcción):

http://mazinger.wordpress.com/
Responder Con Cita
  #12  
Antiguo 11-05-2006
joanajj joanajj is offline
Miembro
 
Registrado: jul 2003
Posts: 144
Poder: 21
joanajj Va por buen camino
Gracias

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...
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Mejorar velocidad de un SQL al consultar muchos datos. RONPABLO SQL 3 24-11-2005 18:10:02
ubicar archivo, con datos sacados de base de datos Giniromero Varios 19 20-10-2005 16:23:02
Como mejorar la velocidad en este caso.... Alfredo Varios 4 02-09-2005 22:45:11
Mejorar metodo!! kye_z Varios 2 21-10-2004 18:56:53
Reto Para Expertos En Base De Datos Y Tipos De Datos.... (blob) frankmch Conexión con bases de datos 2 08-09-2003 19:44:52


La franja horaria es GMT +2. Ahora son las 01:37:51.


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