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 20-11-2004
cesar_picazo cesar_picazo is offline
Miembro
 
Registrado: ene 2004
Posts: 65
Poder: 21
cesar_picazo Va por buen camino
Velocidad en Interbase

Buenas tardes tengan todos.

Estoy utilizando Delphi 6 con componente DBExpress, con base de datos de interbase con Firebird.

He estado desarrollando desde hace un par de años una aplicacion pero ahora que ya estoy prrobando la aplicación con información completa, me topo con la dichosa palaba VELOCIDAD, tengo una DB con 70 tablas y realizo la conexion a la DB y la cierro cada que se abre un formulario, esto es algo que no puedo cambiar de la aplicación y estoy consiente de que es uno de tantos problemas que tengo de velocidad.


Ademas al abrir una tabla con 5000 registros (Catalogo de Productos) y otra con 45000 (catalogo de clientes), esto sin tomar en cuenta que la de Facturas es mayor(pero aqui solo obtengo los datos del mes y no son tanto registros), Pero el detalle es el siguiente, tengo una aplicacion que utiliza DBFs y es mucho más rápida, estoy consiente de que la tecnologia de un DBF no es igual a una de Interbase, pero trabajando local, creo que debe ser el desempeño muy parecido.

Pero bueno despues de tantas cosas mi duda es, Existee alguna forma de hacer que automaticamente la aplicación obtenga los primero de una tabla por ejemplo los primeros 100, y al llegar a los 100, automaticamente obtenga la informacion de la tabla los siguientes 100.

Cuando se abre un formulario con estos datos, trabajando local, tarda 30 segundo Interbase, y en un DBFs con Foxpro se tarda, algo como 7 o 10 segundos.

En alguna ocasion vi algo, como hacer un procedimiento almacenado que solo traiga 100 registros, de la consulta o almenos eso se me ocurre para mejorar velocidad.

espero me entidan lo que quiero, no puedo quitar los clientes o los productos ya que son necesario para la interfaz de la aplicación, al facturar ver a quien se le facturara o al vender para saber que se va a vender, una ves en SQL vi que habia una forma de configurar en el cliente una especie de cache que almacenaba los datos de la DB y cuando abri una o dos veces la misma ventana la velocidad en la primera ves era lenta pero en la segunda era muy aceptable, no se si posible en Firebird hacer algo parecido.

Por su atención gracias y espero alguien sepa que hacer para mejor la velocidad.
Responder Con Cita
  #2  
Antiguo 20-11-2004
Oxa78 Oxa78 is offline
Miembro
 
Registrado: may 2003
Ubicación: Lima - Peru
Posts: 110
Poder: 22
Oxa78 Va por buen camino
Saludos

Si trabajas con DBExpress, deberias tener en tu estructura de conexiones como componente final de acceso a los datos un CLientDataSet, como se muestra en las demos de Delphi sobre DbExpress. Entonces este componente (CLientDataSet) tiene una propiedad llamada PacketRecords la cual por defecto muestra -1, pero si tu colocas como valor 100, inicialmente te traera solo 100 reg, luego 100 y asi.....

En el libro la cara oculta de C++, hay informacion detallada sobre esto, puedes bajartela de la pagina de Ian Marteens

Saludos
__________________
Joseph Buttgembach Verde
Lima - Perú
Responder Con Cita
  #3  
Antiguo 20-11-2004
Avatar de mamcx
mamcx mamcx is offline
Moderador
 
Registrado: sep 2004
Ubicación: Medellín - Colombia
Posts: 3.912
Poder: 25
mamcx Tiene un aura espectacularmamcx Tiene un aura espectacularmamcx Tiene un aura espectacular
O puedes hacer un recorrido virtual. Hay dos maneras. La primera es cargar la lista de solamente los IDs y agregas una propiedad Cargado.

Basicamente, SELECT CampoID FROM Tabla, luego haces una clase como:

TVirtualData
Next;
Prior;
Last;
First;
DataSet;

Al moverte, con First o prior, etc... haces un SELECT * FROM..: WHERE Id=.... y solo carga ese registro.

Una mejora a lo anterior, es jugando con los ordenes. Debes tener un ID numerico ascendente (no tiene que ser secuencial) Luego, la misma clase, pero en vez de cargar la lista de Id, haces asi:

SELECT TOP X * FROM ...

Ahi se te carga el primer grupo de registros. Guardar el primer y ultimo ID. Al hacer Next la consulta cambia a

SELECT TOP X FROM ... WHERE Id>LastId

Reversas el order by para el anterior y para el ultimo. Sabes que has llegado a EOF si el numero de registros retornados es < a X.

La ventaja contra la opcion de los TClientDataSet es que es muy eficiente en cuanto a memoria y velocidad, y se puede balancear jugando con el valor X. Ademas, se hace en menos de 1 dia de codigo con todos los jugeticos
__________________
El malabarista.
Responder Con Cita
  #4  
Antiguo 21-11-2004
cesar_picazo cesar_picazo is offline
Miembro
 
Registrado: ene 2004
Posts: 65
Poder: 21
cesar_picazo Va por buen camino
Muchisimas Gracias

Estuve viendo la opciones que me comentaron y me parecieron muy buenas por el momento estoy utilizando la opcion de PacketRecords, que es la opción rápida para mejorar el desempeño por el momento, pero lo que tambien voy a hacer es agregar en las busquedas, que en lugar de utilizar un locate se realice un query select * from tabla where , ya que al hacer un locate en la tabla se tarda un rato en lo que obtiene los datos del final.

Con esto me parece que voy a salir momentaneamente del problema.

Valide lo que me comentan y con el PacketRecords mejoro la apertura del formulario del 30 segundos a 2 o 4 segundos, que me parece ser una cargado razonable.

La segunda respuesta que me dieron me parece muy buena, pero no se que tanta cosas necesito hacer, para que pueda operar la aplicación, Pero si tienen por hay algun ejemplo de que se tiene que hacer se los agradeceria.

Sin más por el momento me despido y gracias por la ayuda.
Responder Con Cita
  #5  
Antiguo 23-11-2004
AdrianD AdrianD is offline
Miembro
 
Registrado: may 2003
Ubicación: San Juan - Argentina
Posts: 113
Poder: 21
AdrianD Va por buen camino
Recurda algo muy importe, la filosofia de trabajo en sistemas Cliente/Servidor es muy distinata las las de paradox, dbase, etc. No deberias trabajar nunca con tablas, si no con consultas y procedimientos almacenados. Recuerda que para Firebird no es lo mismo un "select * ..." que un "select campo1, campo2, ...".La velocidad cuando ajustes todos los detalles no tiene comparacion sobre todos si va en red. Y recurda algo que simpre mensiona Ian Marteens: "A visto alguna vez una regilla en un cajero de banco", si lo piensas esto puede resolver muchos de tus problemas admás de ayudarte a pensar como se trabaja con estos sistemas
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


La franja horaria es GMT +2. Ahora son las 04:52:17.


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