FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
|
#1
|
|||
|
|||
Vaciar contenido dataset a otro
Buen dia,
cuento con dos motores(db1-oracle y db2-sqlserver05), con unas tablas equivalentes, debo vaciar el contenido de una tabla db1 a db2, para ello, utilizo esta funcion a la cual le paso los dos datasets, origen y destino, que cuentan con las misma estructura: El procedimiento funciona, pero al ejecutarse, hago la prueba cargando en el dataset una tabla de 6 columnas y 50 mil filas, y ejecuta la tarea en mas de 7 horas, lo que me parece exagerado, dado que si subo un csv manualmente, con esa misma informacion, no toma mas de 30 minutos, es mi primera experiencia programando el delphi, desearia conocer sus opiniones con respecto a la eficiencia del codigo, es esta es la solucion mas optima? Agradezco sus sugerencias al respecto. |
#2
|
||||
|
||||
Aún los 30 minutos para el csv que mencionas me parece demasiado. No debería tardar sino un par de minutos. Aunque desconozco los servidores que usas, supongo que tendrán alguna forma de desactivar los índices, que es lo que puede estar alentando el proceso.
Por otro lado, trabajar con variants siempres es más lento. En tu procedimiento podrías, por lo menos, ahorrarte el arreglo intermedio y hacer la asignación directa de un dataset a otro. Y si conoces la estructura de la tabla, sería mejor hacer las asignaciones con los métodos AsInteger, AsFloat, AsString, etc. de los objetos Field para evitar el uso de variants. También, si tienes controles de edición conectados a los dataset, es mejor que uses los métodos DisableControls y EnableControls al hacer el traspaso, para que el proceso no se alente por la actualización visual de los datos. // Saludos |
#3
|
|||
|
|||
Cita:
Cita:
Cita:
Gracias por su respuesta Roman. |
#4
|
|||
|
|||
Creo que la sugerencia del amigo Roman, es acertada.
La propiedad Value de un TFields es de tipo Variant, con lo cual el usar un vector de tipo Variant no tiene justificacion. Ademas en cada ciclo de lectura de sql_Origen, estas dimensionando el vector, creo que eso se debe hacer antes de iniciar el ciclo de lectura una sola vez. Alternativa 1:
Alternativa 2: Saludos... |
#5
|
||||
|
||||
Hola TaaDow.
Lo que más lentitud le causa a ese ciclo es que en cada pasada estás llamando al método ApplyUpdates y éste internamente dispara la apertura y cierre automáticos de una trasacción —¡una transacción por registro!— en la base de datos destino (suponiendo que no hay ya una trasacción abierta antes de iniciar el proceso). Coloca esa sentencia fuera (después) del While, con lo cual seguramente se reducirá significativamente el tiempo que consume la operación. Dinos cómo te funciona de esa manera. Un saludo. Al González. |
#6
|
|||
|
|||
Cita:
Aplique la alternativa dos, siguiendo el consejo Al Gonzales, del applyupdates afuera del ciclo, despues de 5 horas en un 87% mi pc(w7,c2duo,3gb ram) se quedo sin memoria. procesando un dataset de 7 columnas por 52mil registros. Tratare de dividir el dataset por paquetes mas pequeños, de 10mil o 5mil registros. Gracias por sus respuestas. |
|
|
Temas Similares | ||||
Tema | Autor | Foro | Respuestas | Último mensaje |
Copiar el contenido de un DataSet a otro DataSet | Javi2 | Varios | 82 | 22-11-2022 09:26:16 |
Actualizar un dataset desde otro dataset | jafera | Conexión con bases de datos | 17 | 18-12-2008 23:57:10 |
Conectar a un DataSet de otro form. | DarkByte | Conexión con bases de datos | 15 | 10-09-2004 16:27:58 |
Vaciar el contenido de un directorio (Borrar *.*) | Gelmin | Varios | 1 | 22-07-2004 20:21:50 |
Saber si un Tabla(dataset) esta siendo usado por otro componente | cacuna | OOP | 3 | 26-05-2004 18:21:43 |
|