PDA

Ver la Versión Completa : Lentitud Firebird


mjjj
11-01-2008, 22:35:54
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

Caral
11-01-2008, 23:04:14
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

egostar
11-01-2008, 23:07:17
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.:cool:

Salud OS

mjjj
11-01-2008, 23:59:55
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...


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

AzidRain
12-01-2008, 03:22:30
Simple: Usa cualquier otro motor: Firebird, mySQL, PostGress...cualquiera es más rápido que Interbase.

jachguate
12-01-2008, 03:35:06
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.

;)

Delfino
12-01-2008, 10:04:10
Zeos es muy rapido via internet y es facil de usar.
En ningun caso van a ser mas rapidos q los IBX/MDO/Fibplus
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,
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..

Casimiro Notevi
12-01-2008, 13:52:13
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 :D) 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 (http://www.intitec.com/varios/Compara-IB75-FB15.pdf)

Lepe
12-01-2008, 15:27:56
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.

mjjj
12-01-2008, 16:08:16
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

Caral
12-01-2008, 16:31:45
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

mjjj
12-01-2008, 17:29:00
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


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

jachguate
12-01-2008, 17:39:54
Pregunto nuevamente... ¿cual es la línea de código que demora los 20 segundos?

Eso nos dará una idea mas clara.

Hasta luego.

mjjj
13-01-2008, 03:51:48
hola en hacer el siguiente codigo demora 20 segundos.


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??

Delfino
13-01-2008, 12:12:50
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..

Casimiro Notevi
13-01-2008, 12:17:59
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.

mjjj
13-01-2008, 17:35:06
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