FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
|
#1
|
|||
|
|||
Acelerar inserciones masivas en Firebird
Buenas!
Os cuento el problema que tengo: Necesitamos acelerar la inserción en tablas en Firebird (2.1). Usamos los componentes FIBPlus (6.9). Al realizar el proceso de inserción masiva, usamos un TpFIBScripter en el que añadimos las inserts y una vez relleno, ejecutamos el script. Al lanzarlo, el FBServer se come prácticamente el 100% de la máquina (windows) y tarda en torno a 20 segundos en insertar 10.000 líneas. Este proceso está dentro de un bucle y se ejecuta este proceso entre 10 y 15 veces (en total 100mil o 150mil registros). 20 seg cada inserción masiva x 10 = 200 seg (más de 3 min). Necesitamos acelerar este proceso. Hemos probado a cambiar el tamaño del caché. Por defecto trae el valor DefaultDbCachePages = 2048 (8Mb). Cambiándolo a 20480 (80Mb) y no hemos conseguido cambios. Cambiándolo a 204800 (800Mb) suelta un error del tamaño de lectura del caché. Sabéis si existe algún otro truco para hacer este proceso más rápido? Muchas gracias por todo.
__________________
ash nazg durbatulûk ash nazg gimbatul ash nazg thrakatulûk agh burzum-ishi krimpatul |
#2
|
||||
|
||||
Saludos.
Se me ocurre que puedes desactivar los indices si existen, verificar los triggers que se disparan y ver si se pueden desactivar también. En cuanto al tamaño PageSize tienes: 1024, 2048, 4096, 8192 y 16384. No entiendo el porque utilizar el componente TpFIBScripter, si el componente TpFIBDataSet puede realizar el Insert perfectamente. Tanto el TpFIBDataSet como el TpFIBQuery tiene los siguientes métodos de Batch: function BatchInput(InputObject: TFIBBatchInputStream) :boolean; function BatchOutput(OutputObject: TFIBBatchOutputStream):boolean; procedure BatchInputRawFile(const FileName:string); procedure BatchOutputRawFile(const FileName:string;Version:integer=1); procedure BatchToQuery(ToQuery:TFIBQuery; Mappings:TStrings); Otra cosa que se me ocurre es que podrías hacer Soft Commit cada x cantidad de registro. Espero haberte ayudado, hasta luego.
__________________
Gracias, Rolphy Reyes |
#3
|
|||
|
|||
Lo que hago es hacer commit cada 10.000 registros.
Relleno un script, lo lanzo al llegar a 10.000, lo limpio y sigo rellenando. "Soft Commit"? Voy a probar cambiando el caché a 16384. Muchas gracias.
__________________
ash nazg durbatulûk ash nazg gimbatul ash nazg thrakatulûk agh burzum-ishi krimpatul |
#4
|
||||
|
||||
Saludos.
Soft Commit = CommitRetaining. Realmente sigo sin entender el porque utilizar TpFIBScripter para rellenar y borrar y luego rellenar..... El TpFIBScripter vendría siendo como la opción Script Execute de IbExpert donde pones el Script del tamaño que sea con las sentencias que sean (DML y DDL) y lo ejecutas de un golpe. La misma opción tiene la opción, valga la redundancia, de que pones el COMMIT cada x cantidad de registro. Si pudieras ser más especifico en cuanto a lo que quieres lograr sería un poco más facil para ayudarte. Hasta luego.
__________________
Gracias, Rolphy Reyes |
#5
|
|||
|
|||
Lo que hace el programa es pasar los datos de una base de datos de un servidor a una base de datos firebird en local (desconozco la razón por la cual se decidió hacer esto).
Sincronizo los datos tabla a tabla. Una de las tablas es la que me da estos problemas ya que tiene 150.000 registros, el resto no suele tener más de 2.000. Por cada registro genero una insert que añado en el TpFibScripter. Cuando he generado 10.000 inserts, ejecuto el script (TpFibScripter.ExecuteScript), lo limpio (TpFibScripter.Clear) y continuo generando inserts hasta EOF de la query del servidor. Es la ejecución de esos scripts de 10.000 líneas las que tardan 20 segundos cada una. Espero que con esto, me puedas ayudar. Muchas gracias.
__________________
ash nazg durbatulûk ash nazg gimbatul ash nazg thrakatulûk agh burzum-ishi krimpatul |
#6
|
||||
|
||||
Saludos.
Ya entiendo la idea, lo que estas haciendo es un "replicador" de datos. Se me ocurre dos cosas: 1.- Utilizar los métodos que te había mencionado Batchxxx. 2.- Si es una copia tal cual de como esta la BD del Servidor, entonces sería mejor si haces un Backup de la BD y luego un Restore en la PC local. Otra cosa podría ser que consigas un programa como IBReplicator o similares, que ya están hechos y probados.
__________________
Gracias, Rolphy Reyes |
|
|
Temas Similares | ||||
Tema | Autor | Foro | Respuestas | Último mensaje |
ayuda con inserciones masivas | voldemmor | Conexión con bases de datos | 4 | 13-03-2008 21:23:05 |
Problemas Acelerar PHP | HomeCinema | PHP | 1 | 09-02-2007 11:42:04 |
Acelerar carga de Delphi | mamcx | Noticias | 4 | 13-09-2006 00:51:52 |
Problemas con inserciones masivas | gusanita | Conexión con bases de datos | 2 | 16-12-2005 06:40:37 |
Como acelerar el trabajo DBF | manuelpr | Conexión con bases de datos | 3 | 29-03-2005 19:52:11 |
|