Cómo utilizar la red de transacciones SQLite de manera eficiente
SQLite es muy ineficiente. ¡Se necesitan 2 minutos para insertar 1000 registros en lotes!
El siguiente es el código de prueba que me envió.
usando (DbConnection conn = factory.CreateConnection())
{
// Conéctate a la base de datos
conn.ConnectionString = "Data Source=test1.db3";
conn.open();
// Crear tabla de datos
string sql = "crear tabla [test1] ([id] CLAVE PRIMARIA INTEGER, [s] COLLATE TEXTO NOCASE)";
DbCommand cmd = conn.CreateCommand();
cmd.Connection = conn;
cmd.CommandText = sql;
DbCommand cmd = conn.CreateCommand();
cmd.Connection = conn.CommandText = sql; /p>
cmd.ExecuteNonQuery ();
// Agregar parámetros
cmd.Parameters.Add(cmd.CreateParameter()); // Iniciar el reloj
Cronómetro watch = new Stopwatch();
watch.Start()
Watch.ExecuteNonQuery ()Start(); /p>
// Insertar 1000 registros consecutivos
for (int i = 0; i < 1000; i++)
{
cmd. = "insertar en [prueba1] ([s]) valores (?)"
cmd.Parameters[0].Value = i.ToString()
cmd; . ExecuteNonQuery();
}
// Detener el tiempo
watch.Stop()
Console.WriteLine(watch. Elite ())WriteLine(watch.Elapsed);
}
Hola ~~~~ Un error de sentido común, agregaré algunas líneas de código (nuevo código marcado "/ /<- ------------------").
usando (DbConnection conn = factory.CreateConnection())
{
// Conéctate a la base de datos
conn.ConnectionString = "Fuente de datos= test1.db3";
conn.Open();
// Crear tabla de datos
string sql = "crear tabla [test1] ([id] CLAVE PRIMARIA INTEGER, [s] COLLATE TEXTO NOCASE)";
DbCommand cmd = conn.DbCommand cmd = conn.CreateCommand();
cmd.Connection = conn ;
cmd.CommandText = sql;
cmd.ExecuteNonQuery();
// Agregar parámetros
cmd.Parameters.Add (cmd.CreateParameter());
// Inicia el cronómetro
Cronómetro = new Stopwatch()
reloj.> DbTransaction trans = conn. BeginTransaction(); // <-------------------
prueba
{
/ / Insertar 1.000 registros consecutivos
for (int i = 0; i <.1000; i++)
{
cmd.CommandText = "insertar en [test1 ] ([s]) valores (?)" ;
cmd.Parameters[0].Value = i.ToString();
cmd.ExecuteNonQuery();
}
Trans.ExecuteNonQuery().
trans.Commit() // <-------------- -- --- <
}
catch
{
trans.Rollback() // <---- -- -------------
} tirar; // <-------------------
}
/
watch.Stop();
Console.WriteLine(watch.Elapsed); p>
Comprueba el estado de ejecución, que tarda 0,2 segundos. ¿Es esta diferencia demasiado grande?
¿Por qué el simple hecho de habilitar transacciones marca una diferencia tan grande? Es muy simple: SQLite inicia una transacción para cada operación de forma predeterminada, por lo que para insertar 1000 códigos, se deben abrir al menos 1000 transacciones. "Apertura de transacción + ejecución de SQL + cierre de transacción" naturalmente consume mucho tiempo. Más adelante se muestra que la transacción se inició. La razón por la que es tan rápida. De hecho, esto es sentido común básico en las operaciones de bases de datos. Todos deben recordar que no hay ninguna eficiencia si el código no es bueno.