Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Firebird e Interbase (https://www.clubdelphi.com/foros/forumdisplay.php?f=19)
-   -   Firebird mas lento que Paradox... por qué? (https://www.clubdelphi.com/foros/showthread.php?t=56100)

marilinspi 07-05-2008 16:40:22

Firebird mas lento que Paradox... por qué?
 
hola a todos, les cuento estoy pasando un sistema de Gestion comercial de Padadox a Firebird en delphi 7 porque se dice que Firebird es mucho mas rapido que paradox, pero resulta que he probado a ambos gestores con una tabla de 13000 registros y Paradox accede, inserta, modifica, etc. mas rapido que firebird, en que me estare equibocando o que me faltaria hacer? de las dos formas que probe las bases de datos estan en servidores remotos y los componentes que uso para conectarme a firebird son SqlDset, DSetProvider, ClientDataSet y DataSource. Cualquier duda preguntenme y espero su ayuda. Desde ya muchas gracias

RONPABLO 07-05-2008 17:49:48

Firebird o Interbase están diseñados para trabajar con esquemas cliente servidor, mientras que con Paradox esta muy optimizado para trabajar en una estación, de tal forma al hacer un query como el siguiente:

Código SQL [-]
select * from tabla where id = 1

Va a ser más rapido en Firebird que en Paradox, ya que el segundo traerá toda la información hasta tu aplicación y filtrará al final mientras Firebird hace el filtro directamente en el servidor y a la hora de trabajar al hacer un insert o un update será mejor con esta forma de trabajo... pero si la consulta es la siguiente:


Código SQL [-]
select * from tabla

Paradox posiblemente lo haga más rápido que Firebird... ya que la idea de Firebird es de traer información altamente optimizada, mientras la opción paradox es tener todo en memoria...

marilinspi 08-05-2008 00:35:17

Entiendo lo que dice Ronpablo, pero en cualquier sistema va haber consultas como estas: 'Select * from tabla' tanto en Paradox como en Firebird, son indispensables, entonces la pregunta es como hacer en Firebird para que sea mas rápido, abra alguna propiedad, algún componente o alguna forma de escribir el código, no se si alguien me puede ayudar, desde ya muchas gracias

RONPABLO 08-05-2008 01:00:42

La idea es la siguiente, si tu estas trabajando con información realmente necesitas "pocos datos", si quiere sacar un reporte de personas que han pagado entre el 1 de enero del 2008 hasta el día de hoy es ineficiente traer ademas todos los pagos realizados antes del primero de enero, lo mismo si tu quieres ingresar, cambiar o borrar los pagos de Pedro Perez, para que vas a tener en memoria los pagos de mil u once mil personas más que no estas usando en el momento, es ahí a la hora de hacer esos filtros donde Firebird es un monstruo que se come en velocidad a Paradox por lo que te explique anteriormente... Entonces para trabajar yo normalmente uso los componentes IBX, de forma tal que a la hora de consultar los pagos entre fechas hago algo así como el siguiente Query el cual pongo dentro de la propiedad SQL de un componente de tipo IBQuery:

Código SQL [-]
select * from pagos where fecha betwwen :f1 and :f2


Ahora cuando quiero realizar, modificar o borrar pagos trabajo con el componente IBDataSet en la propiedad SelectSQL pongo:

Código SQL [-]
Select * from pagos where id = :unParametro

luego en el componente visual le hago clic derecho al componente IBDataSet y selecciono DataSet Editor y genero los otros códigos de forma automática y así trabajo muy rápido

Lepe 08-05-2008 08:35:23

La forma de agilizar las consultas en Firebird es bien fácil:
- definir clave primaria en todas las tablas
- definir índices sobre los campos de búsquedas más usuales, en forma ascendente o descendente, según se use en las búsquedas. Si es un campo que se repite mucho el mismo valor, no será candidato a ser un índice.
- Ya en modo avanzado, ver el plan de ejecución de la consulta SQL y asignar tú mismo el plan.

Saludos

marilinspi 08-05-2008 14:38:58

hola, Lepe... segui todos tus consejos y la velocidad aumento un 25%, te cuento lo que tengo que hacer es simple, al abrir el formulario Articulos y a travez de esta consulta

Select *
From Articulos
Order by Nombre_ART

traer todos los articulos. Ya le cree el indice al Nombre_ART y la clave primaria a Numero_ART, pero aunque la velocidad haya aumentado sigue siendo lento, no se si tenes algun consejo para darme para esta consulta especifica. Desde ya muchas gracias

Lepe 08-05-2008 16:24:48

Si es un Select *, lo único que puedes hacer es:
Código SQL [-]
select FIRST 100 * 
from articulos
Order by Nombre_ART

con 100 registros llenarás el espacio visible de un Grid, y cuando el usuario use el scroll se pedirá los demás datos.

Saludos

Delfino 08-05-2008 20:33:32

Cita:

pero en cualquier sistema va haber consultas como estas: 'Select * from tabla' tanto en Paradox como en Firebird, son indispensables,
Cierto, y se pueden hacer con Firebird perfectamente, si utilizas los componentes IBX o MDO el componente Table o Dataset correspondiente tiene la propiedad BufferChunks q se pone por defecto a 1000 q son nada para Firebird en local o en red, solo hay q evitar en ciertos momentos el uso innecesario de los metodos Last y Locate..

marilinspi 08-05-2008 21:12:30

Lepe... me intereso tu propuesta, me parecen los primeros 100 con mucha rapidez, pero como hago para que aparezca el resto cuando muevo el scroll. gracias a todos

Lepe 09-05-2008 11:11:24

Pues parece que me he equivocado :o. Las pruebas con IB Expert así lo corrobora.

SELECT TOP 100 SKIP 20 * FROM [...] se suele utilizar para las páginas de noticias, para traer la tercera página de noticias. Intenta con la solución de Delfino

Saludos

marilinspi 13-05-2008 13:50:18

hola les cuento que puede aumentar un poco la velocidad, haciendo los indices y las claves (igualmente no tiene la velocidad que me gustaria). Otra preguntita.... a la hora de guardar un nuevo registro, si o si hay que hacer un refresh? no hay manera de evitarlo, yo en el SqlDataSet y en ClientDataSet al campo clave en la propiedad InKey=true y en el DataSetProvider UpDateMode=WhereKeyOnly, no se si esta bien?. Espero sus ayudas, gracias desde ya

marilinspi 14-05-2008 22:05:30

Que alguien me conteste... se puede o no evitar los refresh? y si es si, como? saquenme la duda. gracias

Lepe 15-05-2008 13:30:25

Yo no he usado clientDatasets, esperemos una respuesta en condiciones por parte de otros foristas.

Saludos

JMG 19-05-2008 10:56:42

Buenas...

Cuando hice mi primera aplicación sobre interbase, hace ya muchos años, una migración de otra hecha en clipper y dbase, las primeras pruebas de rendimiento en local y con pocos registros (10.000-15.000) me daba más velocidad la antigua aplicación sobre dbase que la nueva. Al principio me espanté, yo había vendido como gran ventaja de interbase que aumentaríamos la velocidad (algunos procesos en el viejo sistema tardaban más de 40 horas). Ahora bien, el destino final era trabajar en modo cliente-servidor, con varias decenas de usuarios grabando intensivamente y con aprox.1.500.000 de registros al mes. Cuando hice las primeras pruebas "en real", con usuarios y volumen de datos, me di cuenta de que las ventajas de interbase: los tiempos no crecían en progresión geométrica como en dbase y algunos de aquellos procesos que antes tenían que esperar al fin de semana para lanzarlos, ahora los podían ejecutar en cualquier momento porque no afectaban al rendimiento de los grabadores y tenían el resultado la misma mañana.

En conclusión, cada cosa es para lo que es, una base de datos de escritorio es para eso, para uso en un solo ordenador y con un límitado número de registros, y un SGBDR es para cargar con un buen volumen de datos y en entornos multiusuarios. Pretender que Interbase/Firebird siempre será más rápido que paradox/dbase/access/... es una tontería.

Un saludo,

arrayman 21-05-2008 22:27:09

no entiendo muy bien tu necesidad de hacer un select * from tabla
lo normal es que filtres con un where en la select no obstante el clientdataset tiene tambien una propiedad que le indica cuantos debe recuperar (packedrecords). digamos que hace un select * pero los trae de n en n siendo n el nº indicado en packedrecods (esto es diferente del uso de top skip en cuyo caso lo gestionas tu y yo no te aconsejaria que uses las dos cosas a la vez) en cualquier caso pienso que salvo pequeñas tablas satelite deberias evitar en la medida de lo posible recuperar todos los registros de una tabla.

arrayman 21-05-2008 22:32:58

perdon, pero olvide algo, en cuanto a la configuracion de pinfKey yo la asigno tanto en el clientdataset como en el sqldataset aunque sospecho que es esta ultima la que realmente actua, es un poco confuso para mi, supongo que al poder utilizar el clientdataset con diversos componentes por ejemplo un adodataset o incluso un ttable pues el comportamiento dependera de con cual lo uses. con sqldataset creo que manda la configuracion de los campos persistentes de este ultimo pero como te digo yo lo configuro en los dos.

marilinspi 26-05-2008 20:24:55

Muchisimas gracias arrayman era lo que necesitaba, como soy nueva en el uso de estos componentes no sabia de la existencia de la propiedad PacketRecords y la verdad que la velocidad de acceso mejoro un 100%.
Gracias a todos, entre todos logramos que la velocidad de accedo a los datos haya mejorado notoriamente, este hilo sera de gran utilidad a los que recien comienzan a utilizar estos componentes.


La franja horaria es GMT +2. Ahora son las 17:36:22.

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