Rapidez en Grabación
Publicado por Carlos (41 intervenciones) el 29/07/2020 23:17:18
Muy buenas:
Tengo una Base de datos mdb, que en total entre sus tablas hay unos 600.000 registros, los he pasado a csv, y una de ellas que tiene 50.000 Registros tarda 4h 30m, y la que tiene 280.000 registros va a tardar unas 18h, en pasarlos, lo he intentado tanto desde cvs, txt, como desde la propia mdb, y todos tardan lo mismo, el destino es una BD sqlite, he intentado lo siguiente casos:
Caso A
For x =0 to Lineas del Archivo
1º.- Abrir conexión
2º.- Leer el archivo csv,txt
3º.- Grabar el registro
4º.- Cerrar conexion
next
Caso B
Abrir conexión
Bucle For
Leer el archivo
Grabar Registro
Fin de bucle
Cerrar conexión
Caso C
Begin Trasancción
abrir conexión
Bucle For
Leer el archivo
Grabar Registro
Fin de bucle
Fin Transacción
Cerrar conexión
Por todo esto la importación de todos los datos me va a llevar una 30horas sin parar, sin embargo he visto que hay software de terceros, por ejemplo ESF Database Migration Toolkit - Pro (32-bit) (de pago), que puede traspasar los 50.000 rgtos en unos 4 minutos; por mas que he mirado no veo como poder aligerar ese tiempo, el cliente no puede estar inoperativo tanto tiempo.
Ahora mismo llevo 7h30' y ha pasado 113055 registros y me quedan otros 167.000 Registros.
Sugiero ideas para poder hacer esta incorporación lo mas rapidamente posible, ahora mismo lo que hago es
Tengo una Base de datos mdb, que en total entre sus tablas hay unos 600.000 registros, los he pasado a csv, y una de ellas que tiene 50.000 Registros tarda 4h 30m, y la que tiene 280.000 registros va a tardar unas 18h, en pasarlos, lo he intentado tanto desde cvs, txt, como desde la propia mdb, y todos tardan lo mismo, el destino es una BD sqlite, he intentado lo siguiente casos:
Caso A
For x =0 to Lineas del Archivo
1º.- Abrir conexión
2º.- Leer el archivo csv,txt
3º.- Grabar el registro
4º.- Cerrar conexion
next
Caso B
Abrir conexión
Bucle For
Leer el archivo
Grabar Registro
Fin de bucle
Cerrar conexión
Caso C
Begin Trasancción
abrir conexión
Bucle For
Leer el archivo
Grabar Registro
Fin de bucle
Fin Transacción
Cerrar conexión
Por todo esto la importación de todos los datos me va a llevar una 30horas sin parar, sin embargo he visto que hay software de terceros, por ejemplo ESF Database Migration Toolkit - Pro (32-bit) (de pago), que puede traspasar los 50.000 rgtos en unos 4 minutos; por mas que he mirado no veo como poder aligerar ese tiempo, el cliente no puede estar inoperativo tanto tiempo.
Ahora mismo llevo 7h30' y ha pasado 113055 registros y me quedan otros 167.000 Registros.
Sugiero ideas para poder hacer esta incorporación lo mas rapidamente posible, ahora mismo lo que hago es
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
' Abro la mdb y veo la Tabla Historico de Expedientes
CadenaSelect = "SELECT * FROM Hist_Expte"
If commandString = "" Then
commandString = CadenaSelect
End If
Try
DbConnection.Open()
Catch e As Exception
MessageBox.Show("Error al crear la conexión:" + vbCrLf + e.Message)
Exit Sub
End Try
Dim dbDataSet = New Data.DataSet()
Dim DbDataAdapter = New OleDbDataAdapter(commandString, DbConnection)
Dim dt As DataTable = Nothing
Try
DbDataAdapter.Fill(dbDataSet, "Hist_Expte")
dt = dbDataSet.Tables("Hist_Expte")
Catch ex As Exception
MessageBox.Show("Error al recuperar datos de la tabla:" + vbCrLf + ex.Message)
End Try
DGTabla.DataSource = dt
DbConnection.Close()
'Creo la conexión a Sqlite
Dim conn As New SQLiteConnection(Con1)
conn.Open()
Dim sql As String = ""
For x As Integer = 0 To DGTabla.Rows.Count - 1 'Recorre la DGTabla de acces
'Contador del registro por el que va
Label1.Text = CStr(x + 1) + "/" + CStr(DGTabla.Rows.Count)
'Asigno las variables
cManual = DGTabla.Rows(x).Cells(0).Value.ToString
cFecha = DGTabla.Rows(x).Cells(1).Value.ToString
cUsuario = DGTabla.Rows(x).Cells(3).Value.ToString
cMotivo = DGTabla.Rows(x).Cells(4).Value.ToString
cExplica = DGTabla.Rows(x).Cells(5).Value.ToString
cExplica = Replace(cExplica, "'", "")
cOpen = DGTabla.Rows(x).Cells(6).Value.ToString
Try
sql = "INSERT INTO Hist_Expte (Id_Expediente, FechaRgto,Usuario,Motivo,Explica,Open_Close) VALUES(@param1, @param2, @param3,@param4, @param5, @param6)"
Dim cmdGuardar As SQLiteCommand = New SQLiteCommand(sql, conn)
cmdGuardar.Parameters.AddWithValue("@param1", cManual)
cmdGuardar.Parameters.AddWithValue("@param2", cFecha)
cmdGuardar.Parameters.AddWithValue("@param3", cUsuario)
cmdGuardar.Parameters.AddWithValue("@param4", cMotivo)
cmdGuardar.Parameters.AddWithValue("@param5", cExplica)
cmdGuardar.Parameters.AddWithValue("@param6", cOpen)
' Ejecutamos la sql
cmdGuardar.ExecuteNonQuery()
Catch ex As Exception
MessageBox.Show("No se han actualizado los datos" & vbCrLf & ex.Message)
End Try
DGTabla.CurrentCell = DGTabla.Rows(x).Cells(0)
My.Application.DoEvents()
Next
conn.Close()
End If
Valora esta pregunta


0