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 11-01-2008
mjjj mjjj is offline
Miembro
 
Registrado: mar 2007
Posts: 652
Poder: 18
mjjj Va por buen camino
Lentitud Firebird

Hola amigos... les comento mi problema.

Hice una aplicacion en delphi 2006 y firebird 2.03 y utilize los componentes de lapaleta interbase (TIBQuery y TIBDataset).

El programa puede comunicarse de 2 formas con las bases de datos LOCAL (Intranet) y REMOTA (PortFordward).

El problema surge cuando tengo agregar o que hacer algun modificacion a los datos en forma remota... va muy lento, antes era peor porque utilizaba TIBTable para hacer esto y lo cambie por TIBDataset y mejoro bastante.

Ahora bien que mas puedo hacer para mejorar la velocidad...
- Cambiar de componentes? A cuales?
- Mejorar el servidor? P4 con 1 GB en ram
- Mejorar internet del cliente? ADSL 4 MB

Espero me puedan guiar con este temita...

A proposito la tabla en la cual tengo que hacer las modificacion tiene alrededor de unos 20.000 registros y deberia incrementarse en 10.000 registros por año.

No se si este problema de lentitud sera por el tamaño de las tablas

Buenos... muchas gracias por su tiempo... me han ayudado mucho
Responder Con Cita
  #2  
Antiguo 11-01-2008
Avatar de Caral
[Caral] Caral is offline
Miembro Premium
 
Registrado: ago 2006
Posts: 7.659
Poder: 25
Caral Va por buen camino
Hola
Para mi el problema de lentitud va relacionado mas que nada a la consulta.
En Access por ejemplo se puede hacer una consulta (select * fron tabla), esto sera lo mismo que usar un table pues traera todo el contenido de la tabla, en este caso en access (que no es cliente servidor como firebird) lo soluciono con top (Select Top 20 Miscampos from mi tabla), como ves me enviara solo veinte registros incluso dependiendo de la consulta puede enviarme los que necesite acelerando el proceso mucho.
Nunca he provado IB comparando la velocidad, lo he hecho con ADO y Zeos, Zeos es muy rapido via internet y es facil de usar.
Saludos
Responder Con Cita
  #3  
Antiguo 11-01-2008
[egostar] egostar is offline
Registrado
 
Registrado: feb 2006
Posts: 6.557
Poder: 25
egostar Va camino a la fama
Yo tuve problemas de lentitud al ingresar registros a FB, tardaba varias horas en procesar 15,000 registros, estuve analizando el proceso y descubri que cada vez que queria agregar un registro conectaba a la base, abria la tabla, agregaba el registro, cerraba la tabla y cerraba la conexion de la base de datos. Ahora lo que hago es al inicio del programa conecto la base de datos y abro mi tabla, inserto los 15,000 registros, cierro la tabla y cierro la conexion a la base de datos.

Con eso el proceso lo reduje a 6 minutos, parece increible pero asi fue.

Salud OS
__________________
"La forma de empezar es dejar de hablar y empezar a hacerlo." - Walt Disney
Responder Con Cita
  #4  
Antiguo 11-01-2008
mjjj mjjj is offline
Miembro
 
Registrado: mar 2007
Posts: 652
Poder: 18
mjjj Va por buen camino
hola caral... osea me recomiendas cambiarme a zeos?

Que componente puedo utilizar para guardar registros en una tabla... y que sea lo mas rapido posible. Les dejo aqui el codigo que utizo ahora...

Código Delphi [-]
ibdataset1.Close;
ibdataset1.SelectSQL.clear;
ibdataset1.SelectSQL.add('select * from compras');
ibdataset1.SelectSQL.add('where empresa ='+quotedstr(empresa));
ibdataset1.SelectSQL.add('AND noc='+quotedstr(noc));
ibdataset1.open;

if ibdataset1.isempty = false then
BEGIN
 ibdataset1.Edit;
 ibdataset1.FieldByName('fecha').Asdatetime:=strtodate(sedit2.text);
 ibdataset1.FieldByName('oficina').AsString:=scombobox1.text;
 ibdataset1.FieldByName('lugar_desp').AsString:=scombobox2.text;
 ibdataset1.FieldByName('tipo_oc').AsString:=scombobox3.text;
 
AQUI VAN MAS INGRESOS... LA TABLA TIENE 40 CAMPOS, SOLO PUSE ALGUNO A MODE DE EJEMPLO
 
 ibdataset1.post;
form1.IBTransaction1.Commit;

Que tal este codigo para ingresar datos... como puedo mejorarlo para aumentar la velocidad de la transaccion

Saludos
Responder Con Cita
  #5  
Antiguo 12-01-2008
Avatar de AzidRain
[AzidRain] AzidRain is offline
Miembro Premium
 
Registrado: sep 2005
Ubicación: Córdoba, Veracruz, México
Posts: 2.914
Poder: 21
AzidRain Va camino a la fama
Simple: Usa cualquier otro motor: Firebird, mySQL, PostGress...cualquiera es más rápido que Interbase.
__________________
AKA "El animalito" ||Cordobés a mucha honra||
Responder Con Cita
  #6  
Antiguo 12-01-2008
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 28
jachguate Va por buen camino
Cuándo se programa aplicaciones que se conectarán via Internet hay que tener cuidado sobre que correrá por el canal de comunicación, que es bastante estrecho.

Tu cliente puede tener un ADSL de 4Mb, pero ¿cuanto tiene el servidor? ¿cual es la velocidad real de comunicación entre ambos puntos? ¿hay horas pico u otros factores que afecten la velocidad de comunicación? (por ejemplo, que el mismo canal se use para enviar correos, ver videos o cualquier otra actividad típica de internet)

También hay que saber en detalle que hace la aplicación y cómo funcionan los componentes que usas.

En concreto, he realizado aplicaciones usando Firebird e IBX que van muy bien, incluso con canales mas estrechos, así que puedo garantizar que es posible.

En tu caso concreto, ayudaría que nos contes en que instrucción en particular se produce la "lentitud".

Hasta luego.

__________________
Juan Antonio Castillo Hernández (jachguate)
Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate
Responder Con Cita
  #7  
Antiguo 12-01-2008
Delfino Delfino is offline
Miembro
 
Registrado: jul 2003
Ubicación: Madrid
Posts: 974
Poder: 21
Delfino Va por buen camino
Cita:
Zeos es muy rapido via internet y es facil de usar.
En ningun caso van a ser mas rapidos q los IBX/MDO/Fibplus
Cita:
Simple: Usa cualquier otro motor: Firebird, mySQL, PostGress...cualquiera es más rápido que Interbase.
Esto no es cierto, Interbase es igual de rapido q Firebird, tienen la misma base de codigo, y los dos son mas rapidos q los demas,
Cita:
Que tal este codigo para ingresar datos... como puedo mejorarlo para aumentar la velocidad de la transaccion
Pq no utilizas los controles db-aware y asi ahorras todo este codigo, el efecto es el mismo incluso podria ser mejor,

La lentitud en tu caso no tiene q ver con el motor ni con los componentes, tiene q ver con otras cosas, a falta de mas detalles es dificil adivinar..
__________________
¿Microsoft? No, gracias..
Responder Con Cita
  #8  
Antiguo 12-01-2008
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.043
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Cita:
Empezado por Delfino Ver Mensaje
Esto no es cierto, Interbase es igual de rapido q Firebird, tienen la misma base de codigo, y los dos son mas rapidos q los demas,
Estoy de acuerdo en todo lo que has dicho, menos en esa frase.
Todo es relativo (ya lo dijo Einstein ) y depende de muchos factores, pero, en general, Firebird es más rápido que Interbase.
Test comparativo Interbase 7.5 y Firebird 1.5
Responder Con Cita
  #9  
Antiguo 12-01-2008
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 29
Lepe Va por buen camino
Cita:
Empezado por mjjj Ver Mensaje
AQUI VAN MAS INGRESOS... LA TABLA TIENE 40 CAMPOS, SOLO PUSE ALGUNO A MODE DE EJEMPLO
¿ 40 campos ? lo típico al ver eso es decirte: Busca por "formas normales" o "normalización de base de dato" en google.

En cuanto al uso de controles db-aware, quizás no sea la mejor alternativa. En principio una transacción debe durar el mínimo tiempo posible, con controles db-aware la transacción empezará (supuestamente) cuando le das a editar, y termina al hacer el post (el usuario puede irse a tomar café mientras deja el registro en edición).

Sin controles ad-aware, se prepara un botón que al hacer clic:
- Empezar transacción
- Enviar un sql con la sentencia de actualización/borrado/inserción
- Finalizar transacción.

Todo ocurre en .... ¿milisegundos?

El problema que veo en este hilo es que se están discutiendo muchos factores al mismo tiempo, y eso puede volver loco a cualquiera. mjjj no te agobies , tomálo con filosofía.

Saludos.
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #10  
Antiguo 12-01-2008
mjjj mjjj is offline
Miembro
 
Registrado: mar 2007
Posts: 652
Poder: 18
mjjj Va por buen camino
Ok... me han dado muchas ideas pero nada conciso...

Les cuento algo mas del programa...

Antiguamente guardaba los datos con el componente TIBTable, pero ahi si que iva relamente lento... por sugerencia de otro hilo lo cambie e IBDataset... y mejoro notablemente, pero sigue siendo lento.

Esto se pone lento cuando guardo en cierta tabla... la tabla tiene 40 campos y alrededor de 20 mil registros.

Será que son muchos campos, es decir, envio mucha informacion via internet?

Será bueno utilizar otros Componentes... CUALES?

Utilizo Firebird 2.03, Delphi 2006 y Componentes (Interbase que vienen con Delphi)

POrfavor guienme aer si puedo resolver esto

Gracias
Responder Con Cita
  #11  
Antiguo 12-01-2008
Avatar de Caral
[Caral] Caral is offline
Miembro Premium
 
Registrado: ago 2006
Posts: 7.659
Poder: 25
Caral Va por buen camino
Hola
No me hagan mucho caso, ya saben que de estas cosas no se.
Lo que me extraña mucho es:
Dices que guardas en una tabla con 40 campos eso es normal, que la tabla tenga 20 mil registros que importa.
Digo esto por que normalmente se guarda informacion de tres fromas.
1- Editando los campos, esto solo vera afectados a estos, osea una linea en la tabla.
2- Haciendo un cambio (upDate), esto tambien afectara solo a una linea.
3- Insertando un nuevo registro, esto tambien sera lo mismo, una linea.
Entonces lo que se enviara de informacion o se recivira sera una linea del registro de la tabla.
Esto sera lo mismo si se hace con varias tablas a la vez, seran solo unas lineas.
Sigo con la misma idea, para mi es el procedimiento, la sentencia sql, no tanto los componentes, aunque Zeos sea rapido, cuanta informacion estas enviando y reciviendo, esa es la pregunta?.
Esto es solo un comentario.
Saludos
Responder Con Cita
  #12  
Antiguo 12-01-2008
mjjj mjjj is offline
Miembro
 
Registrado: mar 2007
Posts: 652
Poder: 18
mjjj Va por buen camino
Gracias Lepe por tu consejo... estuve revisando lo de normalizacion de tablas y creo que puedo sacarle mayor provecho a mis tablas utlizando esas ideas.

Por otra parte... lo de cuanta infomacion estoi enviando un registro que se compone de 40 campos... no se si esto es mucho o no para trabajarlo cliente/servidor, porque si lo hago en forma local me funciona perfecto... casi instantaneo todo.

Les explico algo del programa... este sirve para generar ordenes de compra. Dentro de la base de datos tengo 2 tablas... COMPRAS y DETCOMPRAS.

En la primera se guardan datos como: numero de orden de compra (llave), numero cliente, tipo orden, monto orden, centro costos, etc.

En la segunda (DETCOMPRAS), todo el detalle de items asociados a la orden.

Problemas:
Cuando presiono el boton para generar una nueva orden de compra utilizo el siguiente codigo para saber cual es la ultima orden y generar la nueva orden.
La aplicacion maneja las orden para 2 empresas distintas

Código Delphi [-]
F_NVAOC.ibdataset1.close;
F_NVAOC.ibdataset1.selectsql.clear;
F_NVAOC.ibdataset1.selectsql.add('select noc, empresa from compras');
F_NVAOC.ibdataset1.selectsql.add('where empresa='+quotedstr(empresa));
F_NVAOC.ibdataset1.selectsql.add('order by noc desc');
F_NVAOC.ibdataset1.Open;
noc:=F_NVAOC.ibdataset1.fieldbyname('NOC').asinteger;
F_NVAOC.ibdataset1.append;
F_NVAOC.ibdataset1.fieldbyname('EMPRESA').asstring:=empresa;
F_NVAOC.ibdataset1.fieldbyname('NOC').asinteger:=noc+1;
F_NVAOC.ibdataset1.post;
form1.IBTransaction1.COMMIT;

Esto demora unos 20 segundos mas o menos... esta bien??

Existe otra forma de hacer esto mismo, pero que vaya mas rapido.

Bueno... muchas gracias.... again
Responder Con Cita
  #13  
Antiguo 12-01-2008
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 28
jachguate Va por buen camino
Pregunto nuevamente... ¿cual es la línea de código que demora los 20 segundos?

Eso nos dará una idea mas clara.

Hasta luego.
__________________
Juan Antonio Castillo Hernández (jachguate)
Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate
Responder Con Cita
  #14  
Antiguo 13-01-2008
mjjj mjjj is offline
Miembro
 
Registrado: mar 2007
Posts: 652
Poder: 18
mjjj Va por buen camino
hola en hacer el siguiente codigo demora 20 segundos.

Código Delphi [-]
F_NVAOC.ibdataset1.close;F_NVAOC.ibdataset1.selectsql.clear;F_NVAOC.ibdataset1.selectsql.add('select noc, empresa from compras');F_NVAOC.ibdataset1.selectsql.add('where empresa='+quotedstr(empresa));F_NVAOC.ibdataset1.selectsql.add('order by noc desc');F_NVAOC.ibdataset1.Open;noc:=F_NVAOC.ibdataset1.fieldbyname('NOC').asinteger;F_NVAOC.ibdatase  t1.append;F_NVAOC.ibdataset1.fieldbyname('EMPRESA').asstring:=empresa;F_NVAOC.ibdataset1.fieldbyname  ('NOC').asinteger:=noc+1;F_NVAOC.ibdataset1.post;form1.IBTransaction1.COMMIT;

Esta bien eso... o demora mucho??
Responder Con Cita
  #15  
Antiguo 13-01-2008
Delfino Delfino is offline
Miembro
 
Registrado: jul 2003
Ubicación: Madrid
Posts: 974
Poder: 21
Delfino Va por buen camino
Porque no haces uso del componente TIBSQL (o TMDOSQL) y generas por codigo la SQL q se debe mandar, en este caso van a ser dos,

Como ha dicho Caral al tratarse de una linea debe ir rapido..
__________________
¿Microsoft? No, gracias..
Responder Con Cita
  #16  
Antiguo 13-01-2008
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.043
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Cita:
Empezado por Delfino Ver Mensaje
Porque no haces uso del componente TIBSQL (o TMDOSQL) y generas por codigo la SQL q se debe mandar, en este caso van a ser dos,

Como ha dicho Caral al tratarse de una linea debe ir rapido..

Desde luego, algo así debe tardar sólo milésimas de segundo.
Responder Con Cita
  #17  
Antiguo 13-01-2008
mjjj mjjj is offline
Miembro
 
Registrado: mar 2007
Posts: 652
Poder: 18
mjjj Va por buen camino
Gracias por sus sugerencias.... cambie la forma de ingresar datos en las tablas, cambiando el componente TIBDataset por TIBSQL... mejora bastante la velocidad.

Otra pregunta... Navegando en la web, me entere que los mejores componentes para estas situaciones son los "ClientDataSet"

Es eso verdad?
Cuales son esos? .. en que paleta de componentes los encuentro?

Muchas gracias... me han ayudado muchisimo
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
Lentitud en la red. Carlos Arevalo Varios 2 09-07-2007 19:04:08
Lentitud conexión SQL amedina Conexión con bases de datos 8 04-08-2005 21:40:41
Lentitud en Cliente FireBird.... AGAG4 Firebird e Interbase 7 29-03-2005 16:56:51
Lentitud de FireBird 1.03 en Windows 2003 El_Perrito Firebird e Interbase 1 12-08-2004 09:21:25
Lentitud en la red Ignacio Conexión con bases de datos 2 26-08-2003 14:09:39


La franja horaria es GMT +2. Ahora son las 01:12:57.


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