Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Bases de datos > MySQL
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 18-11-2008
golf2008 golf2008 is offline
Miembro
 
Registrado: feb 2008
Posts: 151
Poder: 17
golf2008 Va por buen camino
MySQL LENTO al hacer INSERT INTO sucesivamente

Hola a todos:
Les cuento a ver si a alguien le pasó. Trabajo con Delphi 5 y Zeos.
Con MySQL todo bien, pero a la hora de tener que hacer varios INSERT INTO (dentro de un ciclo), se pone demasiado lento.

Para los que han realizado un sistema comercial integrado con la contabilidad de la empresa, cada vez que se registra una factura hay que hacer un asiento contable por cada producto que integra la factura, dado que cada producto puede tener una imputación contable distinta.

Supongamos una factura de 20 productos, me demora 9 segundos viendo el TXT del ZSQLMonitor. Ni quiero pensar implementado en red lo que va a demorar.

Desde ya muchas gracias.
Responder Con Cita
  #2  
Antiguo 19-11-2008
Avatar de AzidRain
[AzidRain] AzidRain is offline
Miembro Premium
 
Registrado: sep 2005
Ubicación: Córdoba, Veracruz, México
Posts: 2.914
Poder: 21
AzidRain Va camino a la fama
Nada tiene que ver la lentitud en tu caso con el motor. No das muestra de código, lo cual ayudaría mucho. Yo hice algo similar y como lo ataqué fue creando una clase TAsientoFactura a la que le paso el ID de la factura que quiero contabilizar y hago ahi toda la lógica.

Si pones el trozo de código que contiene el ciclo te podremos ayudar un poco màs.
__________________
AKA "El animalito" ||Cordobés a mucha honra||
Responder Con Cita
  #3  
Antiguo 19-11-2008
golf2008 golf2008 is offline
Miembro
 
Registrado: feb 2008
Posts: 151
Poder: 17
golf2008 Va por buen camino
Va el código:
Por cada producto este código se ejecuta tres veces, una por cada renglón del asiento. Si la factura tiene 20 producto, el código se ejecuta unas 60 veces

MD.ZAsientos.SQL.Clear;
MD.ZAsientos.SQL.Text:='INSERT INTO asientos (fecha,cuenta,debe,haber,saldo,comentario,numero,comp,numcom,codprov)'+
'VALUES (:fecha,:cuenta,:debe,:haber,:saldo,:comentario,:numero,:comp,:numcom,:codprov)';
MD.ZAsientos.ParamByName('fecha').Value:=StrtoDate(fecha.text);
MD.ZAsientos.ParamByName('cuenta').Value:=MD.DetalleImputa.Value;
MD.ZAsientos.ParamByName('Debe').Value:=MD.DetalleNetograv.Value;
MD.ZAsientos.ParamByName('comentario').Value:=comentario;
MD.ZAsientos.ParamByName('Numero').value:=nasiento;
MD.zAsientos.ParamByName('Comp').value:=MD.DetalleTipo.Value;
MD.zAsientos.ParamByName('Numcom').Value:=MD.DetalleNumcom.Value;
MD.zAsientos.ParamByName('Codprov').Value:=MD.DetalleCod_prov.Value;
MD.ZAsientos.ExecSQL;

Desde ya muchas gracias
Responder Con Cita
  #4  
Antiguo 19-11-2008
Avatar de seoane
[seoane] seoane is offline
Miembro Premium
 
Registrado: feb 2004
Ubicación: A Coruña, España
Posts: 3.717
Poder: 24
seoane Va por buen camino
Hace poco tuve que hacer un programa que básicamente hacia un montón de Insert en una tabla de MySql y el proceso tardaba muchísimo (te podías ir a tomar un café ), hasta que descubrí que MySql permite la inserción múltiple, es decir, insertar varios registros de una vez.

Por ejemplo (ayuda de MySQL):
Código SQL [-]
INSERT INTO tbl_name (a,b,c) VALUES(1,2,3),(4,5,6),(7,8,9);

Podrías probar a construir tu mismo la consulta e insertar todos los productos de la factura en una sola sentencia.
Responder Con Cita
  #5  
Antiguo 19-11-2008
Avatar de duilioisola
[duilioisola] duilioisola is offline
Miembro Premium
 
Registrado: ago 2007
Ubicación: Barcelona, España
Posts: 1.737
Poder: 20
duilioisola Es un diamante en brutoduilioisola Es un diamante en brutoduilioisola Es un diamante en bruto
Y no tendrá que ver con las transacciones?
Yo trabajo con Firebird y depende de si utilizo Commit o CommitRetaining, la cosa cambia mucho.
Código Delphi [-]
while (no_se_terminen_los_datos) do
begin
   if (not MD.ZAsientos.Transaction.InTransaction) then
      MD.ZAsientos.Transaction.StartTransaction;
   MD.ZAsientos.SQL.Clear;
   MD.ZAsientos.SQL.Text:='INSERT INTO asientos (fecha,cuenta,debe,haber,saldo,comentario,numero,comp,numcom,codprov) '+
   'VALUES (:fecha,:cuenta,:debe,:haber,:saldo,:comentario,:numero,:comp,:numcom,:codprov)';
   MD.ZAsientos.ParamByName('fecha').Value:=StrtoDate(fecha.text);
   MD.ZAsientos.ParamByName('cuenta').Value:=MD.DetalleImputa.Value;
   MD.ZAsientos.ParamByName('Debe').Value:=MD.DetalleNetograv.Value;
   MD.ZAsientos.ParamByName('comentario').Value:=comentario;
   MD.ZAsientos.ParamByName('Numero').value:=nasiento;
   MD.zAsientos.ParamByName('Comp').value:=MD.DetalleTipo.Value;
   MD.zAsientos.ParamByName('Numcom').Value:=MD.DetalleNumcom.Value;
   MD.zAsientos.ParamByName('Codprov').Value:=MD.DetalleCod_prov.Value;
   MD.ZAsientos.ExecSQL;
   MD.ZAsientos.Transaction.Commit;
end;

También puede tener que ver con los triggers que ejecute al insertar en esa tabla.

Última edición por duilioisola fecha: 19-11-2008 a las 14:21:25.
Responder Con Cita
  #6  
Antiguo 19-12-2008
heymatias heymatias is offline
Registrado
 
Registrado: dic 2008
Posts: 7
Poder: 0
heymatias Va por buen camino
Hola, soy nuevo en el foro y nuevo con Delphi. Pero laburo con MySQL desde hace años y te aseguro que hacer varias insersiones es muchísimo más lento que hacer una inserción enorme que haga todo.

Podés hacer una consulta del tipo

INSERT INTO.... ; INSERT INTO...;INSERT INTO.... ; INSERT INTO...;

... y así. La idea es que mover el motor de MySQL cuesta un poco, y si vos hacés todas las inserciones por separado lo estás moviendo cada vez, en cambio, si le dás todas las inserciones para hacer él se encarga de optimizar las mismas.

Cuanto más puedas delegar al motor mejor, está muy bien programado y nada de lo que vos programes va a ser más rápido.


Y fijate de hacer transacciones, porque si grabás la factura y no los asientos vas a tener problemas.


Saludos, matías.-
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

Temas Similares
Tema Autor Foro Respuestas Último mensaje
MySql y Delphi Lento nasedo MySQL 6 04-08-2007 05:35:06
Prepare lento en Firebird.. y en MySQL?? xander MySQL 11 01-11-2006 03:02:36
Un Insert muy lento......... sitrico Conexión con bases de datos 9 30-05-2005 15:52:21
Mysql lento en Win Me y rapido en win 98 miguelb Windows 0 03-02-2005 21:39:00
Mysql lento en Win Me y rapido en win 98 miguelb MySQL 0 30-12-2004 02:22:16


La franja horaria es GMT +2. Ahora son las 03:57:29.


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