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 19-08-2006
Renees Renees is offline
Miembro
 
Registrado: feb 2005
Posts: 53
Poder: 20
Renees Va por buen camino
mejorar este proceso

bueno la migracion la estoy haciendo de esta manera tabla por tabla
alguien me puede decir como mejorar el tiempo. porque por tabla me lleva mas o menos 7 minutos.

while not tabla1.eof do
begin
tabla2.Append;
for i:=0 to tabla1.fieldcount-1 do
begin
tabla2.fields[i].value := tabla1.fields[i].asVariant;
end;
tabla2.Post;
tabla1.Next;
end;

En el AfterPost de la tabla2 hago lo siguiente
procedure TModulo.Tabla2AfterPost(DataSet: TDataSet);
begin
// Confirmamos los cambios y continuamos
try
tabla2.Transaction.CommitRetaining;
Except // Si hay errores, descartamos y seguimos
Tabla2.Transaction.RollbackRetaining;
End;
end;

Diganme porfavor en que puedo mejorar, para hacerlo en menor tiempo. desde ya muchas gracias
Responder Con Cita
  #2  
Antiguo 19-08-2006
juanfergl juanfergl is offline
Miembro
 
Registrado: ago 2006
Posts: 23
Poder: 0
juanfergl Va por buen camino
Post

No debes hacer un post para cada append, puedes hacerlo al final de que recorra la tabla 1.......puede que esto te ayude
Responder Con Cita
  #3  
Antiguo 19-08-2006
Renees Renees is offline
Miembro
 
Registrado: feb 2005
Posts: 53
Poder: 20
Renees Va por buen camino
Sigue tardando

muchas gracias juan por la ayuda acabo de probarla y la verdad que no mejoro mucho sigue en 8 min por tabla ( Me entuciasme pensado que iva a bajar el tiempo pero bueno. y tengo como 40 tablas veras que una complicacion y perdida tiempo. La verdad que estoy enserrado y no le encuentro una solucion. Asi que por favor alguien que tenga una sujerencia seria de mucha alluda para mi. desde muchas gracias
Responder Con Cita
  #4  
Antiguo 19-08-2006
Avatar de jzginez
jzginez jzginez is offline
Miembro
 
Registrado: sep 2003
Ubicación: Puebla, México
Posts: 247
Poder: 21
jzginez Va por buen camino
Hola, yo tnengo que hacer algo parecido aunque aun no me pasan las tablas lo que se es que no son extructuras iguales y voy a tener que usar query's para unir dos o mas tablas y poder obtener los campos en el orden que requiero, pero bueno lo que se me ocurre es crear la consulta de actualización a pata (como me han aconsejado algunos master de este foro ) y despues ejecutarla, toma el código con sus respectivas precauciones ya que aun no lo pruebo y me falta la condición para los campos boolean, posiblemente este mejore el tiempo de respuesta
Código Delphi [-]
var
 Sentencia: string;
 i: Integer;
begin
 query1.sql.clear;
 table1.firts;
 while not table1.eof do
  Begin
   for i:= 0 tabla1.fieldcount-1 do
    Begin
     Sentencia:= 'Insert into Tabla1 (campo1, campo2, campo3....) values(';
     if table1.fields.fields[i].DataType in ([ftString, ftFixedChar, ftWideString])
  then Sentencia:= sentencia +chr(39)+ table1.fields.fields[i].value+chr(39);
     if table1.fields.fields[i].DataType in ([ftSmallint, ftInteger, ftWord, ftAutoInc, ftLargeint])
  then Sentencia:= sentencia +IntToStr(table1.fields.fields[i].value);
     if table1.fields.fields[i].DataType in ([ftFloat, ftCurrency, ftBCD])
  then Sentencia:= sentencia +FloatToStr(table1.fields.fields[i].value);
     if table1.fields.fields[i].DataType in ([ftDate, ftTime, ftDateTime, ftTimeStamp])
  then Sentencia:= sentencia+chr(39)+FormatDateTime('mm/dd/yy',table1.fields.fields[i].value)+chr(39);
     if i < tabla1.fieldcount-1
        then sentencia = sentencia + ','
        else sentencia = sentencia + ');';
    end;
    query1.sql.add(sentencia);
    Sentencia:= '';
    table1.next;
   end;
 query1.ExecSQL;
End;
__________________
Espero poder seguir exprimiéndote el cerebro 8)
Jorge Zamora Ginez
Puebla, Pue. México
Responder Con Cita
  #5  
Antiguo 19-08-2006
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Y a todo esto, ¿de cuántos registros estamos hablando? Digo, porque si son millones de registros quizá sea lo normal. Ahora, yo no trabajo con IB y mucho menos con Informix pero de entrada se me ocurriría desactivar cualquier índice que tenga la tabla destino durante la transferencia. Otro punto que podría ayudar algo es no utilizar variants

Código Delphi [-]
tabla2.fields[i].value := tabla1.fields[i].asVariant;

Ya sé que así parece muy cómodo porque pueden procesarse los campos en un ciclo, pero los variants siempre va a alentar un poco y si se trata de muchos registros, la diferencia podría ser notable. Así que mejor usar

Código Delphi [-]
tabla2.FieldByName('campo').AsInteger := tabla2.FieldByName('campo').AsInteger;

Según el tipo de datos que tenga el campo, usarán AsInteger, AsString, AsFloat, etc.

Más no se me ocurre por ahora.

// Saludos
Responder Con Cita
  #6  
Antiguo 19-08-2006
Renees Renees is offline
Miembro
 
Registrado: feb 2005
Posts: 53
Poder: 20
Renees Va por buen camino
Cantidad de registros

Gracias por brindarme su tiempo y responder a mi problema, bueno la verdad es que las tablas son chicas, sobre las que estoy probando tiene 11.000 registro y me tarda 7 min. Creo que puede estar demorando es en el Bucle del FOR

for i:=0 to Tabla2.fieldcount-1 do
begin
Tabla1.fields[i].value := tabla2.fields[i].asVariant;
end;


Ya que la tabla tiene 66 campos.
Responder Con Cita
  #7  
Antiguo 20-08-2006
Mick Mick is offline
Miembro
 
Registrado: may 2003
Posts: 405
Poder: 22
Mick Va por buen camino
No debes hacer un commit por cada registro, un commit o commitretaining es costoso, haz un commit cada 1000 o 5000 registros, este acelerara mucho la insercion de datos.

El uso de Variants tambien es bastante lento.

Saludos
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
Normalización Adecuada plasma Firebird e Interbase 12 18-10-2006 04:57:01
Migrar datos a access luis juarez Conexión con bases de datos 0 05-05-2006 16:34:14
No encuentra el path despues de migrar datos Walterdf Conexión con bases de datos 2 07-03-2005 19:17:17
Migrar datos desde DBase a Interbase??? Durbed Firebird e Interbase 2 25-08-2004 10:54:44
extension adecuada Irina Firebird e Interbase 2 10-06-2003 13:44:42


La franja horaria es GMT +2. Ahora son las 00:05:27.


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