Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Conexión con bases de datos (https://www.clubdelphi.com/foros/forumdisplay.php?f=2)
-   -   La Forma Adecuada de Migrar Datos ? (https://www.clubdelphi.com/foros/showthread.php?t=34730)

Renees 18-08-2006 22:06:41

La Forma Adecuada de Migrar Datos ?
 
buenas tardes a todos.

Quisiera que me orienten un poco, de como hacer una migracion de datos de una base de dato de informix a una base de dato de interbase.

Las dos bases las tengo identicas son las mismas estructuras (tanto en la de INFORMIX como en la INTERBASE). quisiera que me digan mas o menos que camino seguir cual seria el mas rapido en velocidad para pasar datos.

des ya muchisimas gracias. ha y si ya tubieron algunas experiencias en temas similares agradeceria si lo pueden compartir. hasta luego y muchas gracias.

Renees 19-08-2006 00:02:55

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

juanfergl 19-08-2006 00:06:05

Post
 
No debes hacer un post para cada append, puedes hacerlo al final de que recorra la tabla 1.......puede que esto te ayude

Renees 19-08-2006 01:09:48

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

jzginez 19-08-2006 16:13:29

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 :D) 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;

roman 19-08-2006 18:11:28

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

Renees 19-08-2006 18:31:06

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.

Mick 20-08-2006 02:45:03

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

juanfergl 22-08-2006 15:32:35

Campos de las tablas
 
Estoy de acuerdo.......

Tambien si sabes la estructura de la tabla no deberias hacer ese ciclo for para los campos...........si no quemar en el codigo el nombre del campo.
Esto evita que procesador pierda seg valiosos por cada campo.
El otro punto no se ........y en la maquina que corres el proceso será de pronto la ideal?'.

jachguate 22-08-2006 18:18:05

Tu proceso está insertando solamente 26 registros por segundo. He hecho pruebas de stress sobre firebird 1.5.3, y en una máquina con procesador de 3.2 Ghz. con 2 Gb. de RAM he logrado insertar 12000 registros/seg. en una tabla de pocos campos, con un proceso hecho en delphi con IBX, en un solo hilo de ejecución y la verdad el uso del procesador no llegaba ni al 30%.

Así que si no es que informix retorna los registros así de lento, creo que los tiros van por donde aconsejaba roman:
Desactiva todos los índices (incluso las llaves primarias podes crearlas después, y será mucho mas rápido).

Yo también desactivaría todos los triggers que no sean vitales para la migración.

Saludos.

ramiretor 23-08-2006 19:44:38

Hola:
Pues eso de las migraciones como que es bastante latoso la verdad, aparte de lo que te dicen de desactivar todo en la base de datos destino, necesitas revisar si lo que se tarda es en leer la información a migrar (en abrir la tabla origen). Tienen razón la verdad es que he bajado cien, doscientos mil registros de tablas Oracle a IB (¿cual es la versión que viene en Delphi7?) en razón de pocos minutos.

Saludos


La franja horaria es GMT +2. Ahora son las 01:13:05.

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