FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
#1
|
|||
|
|||
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. |
#2
|
|||
|
|||
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ú |
#3
|
||||
|
||||
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. |
#4
|
|||
|
|||
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. |
#5
|
|||
|
|||
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
|
|
|
|