SQLite插入非常慢?

我最近读了SQLite,并认为我会试试看。 当我插入一条记录时,它表现良好。 但是当我插入一百个时,它需要五秒钟,并且随着记录数量的增加,时间也会增加。 什么可能是错的? 我正在使用SQLite包装(system.data.SQlite)

dbcon = new SQLiteConnection(connectionString);
dbcon.Open();

//---INSIDE LOOP

 SQLiteCommand sqlComm = new SQLiteCommand(sqlQuery, dbcon);

 nRowUpdatedCount = sqlComm.ExecuteNonQuery(); 

//---END LOOP

dbcon.close();

BEGIN END语句包装在您的批量插入中。 Sqlite针对交易进行了优化。

dbcon = new SQLiteConnection(connectionString);
dbcon.Open();

SQLiteCommand sqlComm;
sqlComm = new SQLiteCommand("begin", dbcon);
sqlComm.ExecuteNonQuery(); 
//---INSIDE LOOP

 sqlComm = new SQLiteCommand(sqlQuery, dbcon);

 nRowUpdatedCount = sqlComm.ExecuteNonQuery(); 

//---END LOOP
sqlComm = new SQLiteCommand("end", dbcon);
sqlComm.ExecuteNonQuery(); 
dbcon.close();

尝试将所有插入(也就是批量插入)包装到单个事务中:

string insertString = "INSERT INTO [TableName] ([ColumnName]) Values (@value)";

SQLiteCommand command = new SQLiteCommand();
command.Parameters.AddWithValue("@value", value);
command.CommandText = insertString;
command.Connection = dbConnection;
SQLiteTransaction transaction = dbConnection.BeginTransaction();
try
{
    //---INSIDE LOOP
    SQLiteCommand sqlComm = new SQLiteCommand(sqlQuery, dbcon);
    nRowUpdatedCount = sqlComm.ExecuteNonQuery(); 
    //---END LOOP

    transaction.Commit();
    return true;
}
catch (SQLiteException ex)
{
    transaction.Rollback();
}

默认情况下,SQLite将每个插入包装在一个事务中,这会减慢过程:

INSERT很慢 - 我每秒只能做几十个INSERT

实际上,SQLite在一台普通台式机上每秒钟可以轻松完成50,000或更多的INSERT语句。 但它每秒只能做几十个事务。

交易速度受磁盘驱动器速度的限制,因为(默认情况下)SQLite实际上会一直等到数据确实在交易完成之前安全地存储在磁盘表面上。 这样,如果您突然断电或者您的操作系统崩溃,您的数据仍然安全。 有关详细信息,请阅读SQLite中的原子提交。

默认情况下,每个INSERT语句都是它自己的事务。 但是,如果使用BEGIN ... COMMIT包围多个INSERT语句,则所有插入操作都会分组到一个事务中。 提交事务所需的时间将在所有随附的插入语句中摊销,因此每个插入语句的时间会大大减少。


我到处读到创建事务是减慢SQLite写入速度的解决方案,但重写代码并将所有SQLite写入事务处理可能会很长很痛苦。

我发现了一个更简单,安全和非常高效的方法:我启用了一个(默认情况下禁用)SQLite 3.7.0优化:写入前沿日志(WAL)。 文档说它适用于所有Unix(即Linux和OSX)和Windows系统。

怎么样 ? 在初始化SQLite连接之后,只需运行以下命令:

PRAGMA journal_mode = WAL
PRAGMA synchronous = NORMAL

我的代码现在运行速度提高了600%:我的测试套件现在运行38秒而不是4分钟:)

链接地址: http://www.djcxy.com/p/19825.html

上一篇: SQLite Insert very slow?

下一篇: SQLite inserts wrapped in one transaction: no speed improvement