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 04-04-2010
JF Sebastian JF Sebastian is offline
Miembro
 
Registrado: oct 2006
Posts: 108
Poder: 18
JF Sebastian Va por buen camino
Tablas TADOTable en memoria

El cuello de botella de mi aplicación reside en la lectura de la base de datos. Ésta no ocupa mucho (18 Mb), por lo que desearía cargarla toda en memoria, pero no sé cómo ni si es posible... En principio sólo necesito operaciones de lectura.

Agradecería enormemente alguna sugerencia.

Un saludo
Responder Con Cita
  #2  
Antiguo 04-04-2010
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.057
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Haces una pregunta muy genérica, aclara exactamente qué problema tienes, qué quiéres conseguir, etc.
Y no olvides decir al menos qué base de datos usas

p.d. No te aconsejo leer la guía de estilo porque no ahora no funciona , pero puedes leer la otra guía de estilo, la que está en mi firma
Responder Con Cita
  #3  
Antiguo 04-04-2010
JF Sebastian JF Sebastian is offline
Miembro
 
Registrado: oct 2006
Posts: 108
Poder: 18
JF Sebastian Va por buen camino
La base de datos es un .mdb y consta de 7 tablas con MasterFields activado. El tipo de conexión se realiza mediante Microsoft.Jet.OLEDB.4.0. En una parte crítica de la aplicación se necesita realizar una gran cantidad de operaciones de lectura en varias tablas mediante Locate() y FieldByName().
Basicamente existen 3 tablas T1,T2,T3 en las cuales T2.MasterSource apunta a T1 y T3.MasterSource apunta a T2. Estas 3 Tablas tienen definido IndexFieldNames. Lo que trato de optimizar en velocidad es leer el registro Numero n de la tabla T3

Lo que hago actualmente es:

//Localizacion del registro determinado mediante locate. (Lento)
err1 := not T1.Locate('TIPO',TipoPerfilId,[]); //Familia de perfiles
err2 := not T2.Locate('NOMBRE',Perfil,[]); //Grupo de perfiles perteneciente a una familia
err3 := not T3.Locate('NOMBRE', serie1, []); //Perfil perteneciente a un grupo de perfiles


//Posicionamiento del registro dentro de la tabla T3 (Lento)
err := False;
T3.First;
i := 1;
if n>1 then
repeat
i := i+1;
err := T.Eof;
T3.Next;
until (i=n) or err;

//Lectura del registro (Rapido)
Actual(T1,T2,T3,err);


Un saludo y gracias por vuestra paciencia.

Última edición por JF Sebastian fecha: 04-04-2010 a las 12:43:12. Razón: Mas informacion
Responder Con Cita
  #4  
Antiguo 04-04-2010
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.057
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
¿Hay algún motivo para no usar sql?, debería ser más rápido.
Responder Con Cita
  #5  
Antiguo 04-04-2010
JF Sebastian JF Sebastian is offline
Miembro
 
Registrado: oct 2006
Posts: 108
Poder: 18
JF Sebastian Va por buen camino
Lo que pretendo es eliminar los locates (que tardan mucho). Lamentablemente nunca he trabajado con SQL por lo que no me es familiar.
Desearia probar el rendimiento con SQL, pero no se muy bien como hacerlo

Un saludo
Responder Con Cita
  #6  
Antiguo 04-04-2010
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.057
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
El compañero Caral escribió un tutorial de cómo hacer un programa con las características técnicas que usa el tuyo, te aconsejo que lo leas, verás que es más sencillo de lo que parece.
Aquí está.
Responder Con Cita
  #7  
Antiguo 04-04-2010
JF Sebastian JF Sebastian is offline
Miembro
 
Registrado: oct 2006
Posts: 108
Poder: 18
JF Sebastian Va por buen camino
Tenías razón, era más facil de lo que pensaba. Acabo de realizar la prueba con TADOQuery y SQL pero lamentablemente los tiempos son similares a con locate .

Supongo que una vez realizada la búsqueda con locate y posicionado el cursor en el registro, la lectura se realiza desde memoria y es muy rápida. Lo costoso resulta realizar la búsqueda en el .mdb que reside en disco.

Lo ideal sería leer toda la base de datos del .mdb y traerla a memoria, esto llevaría tiempo pero se haría una sola vez... Es esto posible??

Un saludo
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
FastReport con tablas en memoria David Impresión 2 29-01-2013 17:43:37
Tablas o consultas en memoria jmdd SQL 3 08-08-2007 19:26:19
out of memory con tablas en memoria jrmanso Firebird e Interbase 8 20-06-2007 21:57:37
Asesoramiento: ¿Tablas temporales, datos en memoria...? kuan-yiu Varios 15 21-08-2006 20:25:35
TADOTable al completo en memoria??? Pandre Conexión con bases de datos 2 15-11-2003 03:07:57


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


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