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 18-08-2006
Renees Renees is offline
Miembro
 
Registrado: feb 2005
Posts: 53
Poder: 20
Renees Va por buen camino
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.
Responder Con Cita
  #2  
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
  #3  
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
  #4  
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
  #5  
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
  #6  
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
  #7  
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
  #8  
Antiguo 20-08-2006
Mick Mick is offline
Miembro
 
Registrado: may 2003
Posts: 405
Poder: 21
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
  #9  
Antiguo 22-08-2006
juanfergl juanfergl is offline
Miembro
 
Registrado: ago 2006
Posts: 23
Poder: 0
juanfergl Va por buen camino
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?'.
Responder Con Cita
  #10  
Antiguo 22-08-2006
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 27
jachguate Va por buen camino
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.
__________________
Juan Antonio Castillo Hernández (jachguate)
Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate
Responder Con Cita
  #11  
Antiguo 23-08-2006
ramiretor ramiretor is offline
Miembro
 
Registrado: may 2003
Ubicación: México
Posts: 196
Poder: 21
ramiretor Va por buen camino
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
__________________
Ernesto R.
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 11:08:55.


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