Red de conocimiento informático - Conocimiento informático - Cómo utilizar la red de transacciones SQLite de manera eficiente

Cómo utilizar la red de transacciones SQLite de manera eficiente

Hoy, un amigo probó SQLite y llegó a la conclusión:

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

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.