 |
Club Builder Foro de C++Builder en español
|
| Ver tema anterior :: Ver tema siguiente |
| Autor |
Mensaje |
Luis Anibal Lt


Registrado: 12 Nov 2002Mensajes: 84Ubicación: Santiago del Estero, Argentina
|
Publicado: Mar 31 Jul, 2007 3:08 pm Asunto: Performance muy baja en FireBird en insercion masiva |
|
|
Amigos,
Tengo un sistema para una financiera usando PARADOX, a los comercios adheridos se les envia informacion y estoy ARMANDO DE NUEVO este modulo usando FIREBIRD.
Hasta ahora (con PARADOX), para generar los datos a enviar demoraba, a lo sumo 20 min o media hora. Son casi 40000 clientes, 150000 creditos y luego sus cuotas y pagos.
El tema es que con FIREBIRD se me van los tiempos a HORAS !! (+de2)
Tengo definidas en su propio datamodule todas las tablas paradox y en otro estan definidas la base de datos y las tablas firebird -TIBDataSet- (CLIENTES, CREDITOS, CUOTAS, PAGOCUOT), estan definidas las correspondientes integridades referenciales y algunos triggers.
El proceso es muy sencillo, hace un while de clientes (paradox), haciendo un TIBClientes->Append(), Post() y un CommitRetaining() cada 100 o cada 1000 registros, estuve probando y es lo mismo.
Dentro de este while llama a ProcesoCreditos() que hace, tambien un while por cada credito y llama a ProcesaCuotas() que a su vez llama a ProcesaPagos().
Existe otro metodo con el cual pasar los datos de tablas PARADOX a FIREBIRD sin padecer esta demora excesiva ?
He intentado leer directamente los datos paradox usando un alias, y definiendo un TIBSQL, haciendo un
INSERT INTO CLIENTES (NRODOC, NOMCLI, STATUS, FECHASTATUS)
SELECT NRODOC, NOMCLI, STATUS, FECHAST FROM ':GESTCRED:CLIENTES.DB'
pero no me reconoce el :GESTCRED:.
Usando un TDataBase (BDE) y un TQuery, me da el mismo error.
O tal vez hay parametros que cambiar en el mismo FIREBIRD, alguna otra cosa que se pueda hacer ?
Quedo a la espera de vuestra amable colaboracion. _________________ Luis Anibal Mendez
Analisis, Programacion, Asesoramiento
luisanibalmendez@gmail.com |
|
| Volver arriba |
|
 |
Angel Master


Registrado: 15 Abr 2003Mensajes: 2311Ubicación: Toledo (España)
|
Publicado: Mie 01 Ago, 2007 7:47 am Asunto: |
|
|
Yo tuve un problema similar al migrar una base de datos de Paradox a Firebird y al final tuve que optar por hacer un TQuery sobre la tabla Paradoz para ir insertanod los registros con un TIBQuery en la tabla Firebird. Me da la impresión que TIBQuery o un TQuery no saben interpretan las tablas de otros motores. Por si te sirve, te pongo el código que he usado:
| Código: | Salida->Close();
Salida->SQL->Text = "SELECT Apellidos, Nombre, Registro, Nif, Sexo, F_nacim, Domicilio, Cpostal, Municipio, Provincia, Profesion, C_electronico, Tlf_part, Tlf_prof, Tlf_movil, Situacion, Correo, F_alta, F_baja, M_baja, N_afiliado, Afiliacion, JLocal, C_refer, Periodo, F_pago, Cuota, Entidad, Sucursal, Digitos, Numero FROM '\Persona.db'";
Salida->Open();
Query->Close();
Query->UnPrepare();
Query->SQL->Text = "INSERT INTO Personas (Apellidos, Nombre, Registro, Nif, Sexo, F_nacim, Domicilio, Cpostal, Municipio, Provincia, Profesion, C_electronico, Tlf_part, Tlf_prof, Tlf_movil, Situacion, Correo, F_alta, F_baja, M_baja, N_afiliado, Afiliacion, JLocal, C_refer, Periodo, F_pago, Cuota, Entidad, Sucursal, Digitos, Numero) VALUES (:Apellidos, :Nombre, :Registro, :Nif, :Sexo, :F_nacim, :Domicilio, :Cpostal, :Municipio, :Provincia, :Profesion, :C_electronico, :Tlf_part, :Tlf_prof, :Tlf_movil, :Situacion, :Correo, :F_alta, :F_baja, :M_baja, :N_afiliado, :Afiliacion, :JLocal, :C_refer, :Periodo, :F_pago, :Cuota, :Entidad, :Sucursal, :Digitos, :Numero)";
Salida->First();
while (!Salida->Eof)
{
if (Salida->FieldByName("Situacion")->AsString != "*")
{
Query->Close();
Query->UnPrepare();
for (nItem = 0; nItem <Salida>FieldDefs->Count; nItem ++)
switch (Salida->FieldDefs->Items[nItem]->DataType)
{
case ftString:
Query->ParamByName(Salida->FieldDefs->Items[nItem]->Name)->AsString = Salida->FieldByName(Salida->FieldDefs->Items[nItem]->Name)->AsString;
break;
case ftInteger:
case ftSmallint:
Query->ParamByName(Salida->FieldDefs->Items[nItem]->Name)->AsInteger = Salida->FieldByName(Salida->FieldDefs->Items[nItem]->Name)->AsInteger;
break;
case ftDate:
Query->ParamByName(Salida->FieldDefs->Items[nItem]->Name)->AsDateTime = Salida->FieldByName(Salida->FieldDefs->Items[nItem]->Name)->AsDateTime;
break;
case ftBCD:
Query->ParamByName(Salida->FieldDefs->Items[nItem]->Name)->AsFloat = Salida->FieldByName(Salida->FieldDefs->Items[nItem]->Name)->AsFloat;
break;
}
Query->Prepare();
try
{
Query->ExecSQL();
}
catch(...)
{
}
}
Salida->Next();
} |
Salida es un TIBQuery que actúa sobre la tabla Firebird y Query es el TQuery que extrae los datos de la tabla Paradox. Sólo ha habido que tener la precaución de llamar igual a los campos de ambas tablas.
Y sí te puedo asegurar que he ganado en rendimiento. Uno de los procesos, que es una generación de recibos, se ha reducido más o menos al 20% de lo que duraba; no son tantos registros como en tu caso, pero la tabla de recibos debe tener ahora unos 100.000 registros. _________________ Un saludo
Necesitamos tu ayuda: Envía AI al 27595 (Coste 1,20 euros + IVA) |
|
| Volver arriba |
|
 |
Cesar C. Salazar Gonzalez Master


Registrado: 01 Oct 2002Mensajes: 2155Ubicación: San Cristóbal de Las Casas, Chiapas
|
Publicado: Mie 01 Ago, 2007 8:14 am Asunto: |
|
|
bien, al parecer alguien más se ha encontrado con un problema de conexión en cuanto a las bases de datos remotas y el uso de protocolos para agilizar la información.
Con respecto a lo que tu comentas, hay 3 puntos que quiero comentarte.
1.- El primero de ellos trata sobre la configuración de los parametros y puertos que Firebird / Interbase, tienen, con relación a las conexion, vamos por las partes, fundamentales, cuando todo mundo llega he instala el servidor o el cliente de Firebird, pues es todo no?, pues no! vamos dejarlo en que muchos Incluyendome asi lo hice, instalé el programa de Firebird, bajado de la red, y hooo !! sorpresa, mi programa se conecta a una velocidad de 36 segs a la base de datos, como todos sabemos (ahora ya tambien lo sé), Firebird, usa el puerto local 3050 para las conexiones de transaccion y de la base de datos, pero hay un puerto que es el que tambien debe activarse dentro de un Firewall y es el puerto 3051, este ultimo puerto sirve para el envio y recepcion de eventos sobre la base de datos (IBEvents) bien, cuando yo instale el programa Firebird, en dos terminales, accediendo vía Internet, con una conexion ADSL de 1024/256 (la conexion baja de nuestra compañia telefonica aqui en Méx) me di cuenta, qué la información se trasmite de manera casi muy lenta, eso hizo que modificara de manera manual las configuraciones del archivo Firebird.config dejandolo de la siguiente manera
| Código: |
# MODIFICACIONES ECHAS POR CESAR. SALAZAR GONZALEZ
# PARA ACTIVAS LOS SERVIDORES, FIREBIRD
# DefaultDbCachePages = 2048
# RemoteServicePort = xxxxx
# RemoteAuxPort = xxxxx
# TcpRemoteBufferSize = 8192
#######################################
# MODIFICACION CESAR
#######################################
TempDirectories = c:\WINDOWS\Temp 500000000
DefaultDbCachePages = 10240
MaxUnflushedWrites=100
ConnectionTimeOut=35
GuardianOption=1
RemoteServicePort = xxxxxx
RemoteAuxPort = xxxxxx
TcpRemoteBufferSize = 16384
TcpNoNagle = 1
IpcMapSize= 8192
RemoteFileOpenAbility=0
####################################### |
esta información que establezco en la parte de arriba, es la unica informacion que pongo a travez de una funcion de verificación para checar que el archivo que tengo instalado en Firebird, sea el mio y no el de el mismo programa, quiero hacer incapie en dos puertos que estoy estableciendo con "xxxxxx" pues son los dos puertos importantes que deben habririse usando Números de puertos diferentes al que por default viene.
RemoteServicePort = xxxxxx <--- Puerto para conexio de la base y transaciones
RemoteAuxPort = xxxxxx <--- puerto para el manejo de eventos (IBEvents)
aqui defino los puertos que me interezan use mi programa tanto en las 2 estaciones.
Esta información me agilizó completamente la transferencia de datos, pero he ahi el otro pero que hablaré en el a parte 2.
2.- Despues de conectarme a la base de datos y ver el que el rendimiento se habia echo mas corto, tambien me di cuenta que no era lo suficiente mente rápido, para las transacciones de la base de datos y busque por la red, "algo" que me hiciera la vida mas rápida, pues bien buscando en la red, encontre, un programa de nombre ZeBeDee que hace un "Tunel", para las conexiones algo asi como una VPN entre las 2 o mas estaciones que acceden al servidor, la documentacion puede encontrarse aqui, este software consiste en establecer un puerto espesifico 11965 por donde TODAS las conexion que se hagan en la red entre los equipos pasen por el algo asi como un Embudo (dispositivo para vaciar un liquido en otro, teniendo un lado mas nacho que el otro), este proceso se conoce como "Tunneling", como ejemplo esto qued asi
| Código: |
\ /
Pc Servidor <--> ---tunneling zebedee----- <--> Pc Estaciones
/ \
|
Esto hace que las conexiones se aceleren usando mas eficientemente los recursos, cuando tuve que realizar la conexion, tambien tuve que crear dos archivos del mismo programa llamado zebedee.exe (cliente.exe, server.exe) que son los mismos pero me sirven para activar el cliente y el servidor, lo unico que se realiza es el redireccionamiento de los puertos a usar, a travez del la misma direccion Local (127.0.0.1) al tener activado el zbd este envia por el puerto 11965 a la otra computadora quedando algo asi
| Código: |
3050\ / 3050
11965<-->127.0.0.1(Cliente)<-->zbd tunneling <-->(Server)127.0.0.1<-->11965
3051/ \ 3051 |
redireccionando los puertos que usa firebird, a la maquina local (127.0..) y enviarlos por el puerto 11965 tanto en el cliente como a la inversa.
y como zbd, usa tambien un archivo de configuracion, este puede quedar asi:
| Cita: | En la configuración del servidor:
target localhost:45001-45004
En el cliente puede arrancar zebedee
zebedee 45001-45004:serverFirebird:45001-45004
|
Despues realizar mis pruebas la velocidad de conexion y transaccion se acelero de una manera drástica, digamoslo asi,
Servidor en Arizona-EEUU <---> Estacion Mex-Chiapas
sin zbd la conexion se realizaba en 36 segs
con zbd la conexion se realiza en 4 segs. esto es bastante tiempo si comparamos la distancia y los segmentos de red (por los nodos por donde debe conectarse para estalbecerse el contacto)
Aun que no todo habia sido "Miel sobre hojuelas" otro punto muy importante que tuve que tomar en cuenta fue EL DISEÑO DE LA BASE DE DATOS" y es que algo muy PERO MUY importante es que NO debes creer que firebird funciona como lo hace paradox, si intentas traer 1500 registros que son pocos, muy pocos.. intenta traer unos 10 millones de registros. veras que tanto paradox como Firebird y como cualquier otra base de datos pones el cable de red al rojo vivo, ya no te digo la conexion a internet, tu compañia puedes creer que estas usando programas p2p o descargando 200 peliculas.
3.- Punto Final y ultimo, debes optimizar tus consultas enviando y trayendo unicamente los registros que te sirven, si en una base de datos tienes mil y solo usas 2, por que generar una sentencia SQL como esta
Select * From TablaMilRegistros
que esta enviando del lado del cliente 1000 registros de los cuales solo 2 son los que van a servirle?
Esto es diseño de base de datos, en paradox, NO existe tal diseño, paradox es un sistema viejo al estilo Clipper-Fox, que NO tiene nada de diseño de base de datos, por que lo que hace es traer TODOS los registros del lado del cliente, aun cuando el cliente solo mueva Flecha abajo para ver el siguiente, en el libro de "The Dark Side of BCB" Ian Marteen pide encarecidamente NO usar nunca las rejillas (DBGrid) a menos que realmente sea el ultimo recurso, y enviar UNICAMENTE los datos que se deben consultar AHI ES donde entra la potencia de SQL
Bien espero no haber ampliado mucho la respuesta, pero a lo mejor esto es importante para quienes empiezan a tener problemas en conexion via Remota.
Saludos. se Aceptan criticas. _________________
 |
|
| Volver arriba |
|
 |
Luis Anibal Lt


Registrado: 12 Nov 2002Mensajes: 84Ubicación: Santiago del Estero, Argentina
|
Publicado: Mie 01 Ago, 2007 12:49 pm Asunto: Performance muy baja en FireBird en insercion masiva |
|
|
Angel y Cesar Salazar,
Muchas gracias por responder, voy a probar lo de Angel, con respecto a lo de Cesar, son muy buenas sus sugerencias e indicaciones, me sirven a futuro, porque ...
Y esto es lo que omiti (perdon) indicar en su momento.
Estoy usando FireBird 2.0 sobre XP y lo estoy accediendo en modo local.
Que es, a fin de cuentas, la manera en que el programa va a trabajar.
Pero, ya estoy evaluando el mudar completamente la aplicacion de paradox a FireBird (camino obvio, que no ?).
Ya que estamos, he bajado el .rpm para linux y he creado /opt/firebird,
dentro de este (supongo) tengo que ejecutar rpm -xvz FireBirdxxx.rpm, pero anoche estaban a punto de apagarme el servidor, asi que me fui.
Hoy continuo y luego les cuento. _________________ Luis Anibal Mendez
Analisis, Programacion, Asesoramiento
luisanibalmendez@gmail.com |
|
| Volver arriba |
|
 |
Luis Anibal Lt


Registrado: 12 Nov 2002Mensajes: 84Ubicación: Santiago del Estero, Argentina
|
Publicado: Jue 02 Ago, 2007 7:06 pm Asunto: QUE GRANDE LA LISTA !! |
|
|
Segui las indicaciones de Angel, creando en runtime componentes TIBQuery para agregar los datos a las tablas (INSERT INTO), y la diferencia fue ESPECTACULARRRRR !!!
Los tiempos de proceso se derrumbaron, a tal punto que entro a escribir esta respuesta y mientras la estoy escribiendo, YA HA TERMINADO !!
Muchas, muchas gracias !! _________________ Luis Anibal Mendez
Analisis, Programacion, Asesoramiento
luisanibalmendez@gmail.com |
|
| Volver arriba |
|
 |
|
|
No puedes publicar temas nuevos en este foro No puedes responder a temas en este foro No puedes editar tus mensajes en este foro No puedes borrar tus mensajes en este foro No puedes votar en las encuestas de este foro
|
© 2002–2026 Club Builder · Funciona con phpBB.
|