我有一个file.sql
文件,其中包含20,000
个插入命令。
.sql
文件的示例:
INSERT INTO
table
VALUES (1,-400,400,3,154850,'文本',590628,'TEXT',1610,'TEXT',79);INSERT INTO
table
VALUES (39,-362,400,3,111659,'Text',74896,'TEXT',0,'TEXT',14);
我使用以下代码创建了一个内存SQLite数据库,并将值提取到其中,然后计算经过的时间。
using (var conn = new SQLiteConnection(@"Data Source=:memory:"))
{
conn.Open();
var stopwatch = new Stopwatch();
stopwatch.Start();
using (var cmd = new SQLiteCommand(conn))
{
using (var transaction = conn.BeginTransaction())
{
cmd.CommandText = File.ReadAllText(@"file.sql");
cmd.ExecuteNonQuery();
transaction.Commit();
}
}
var timeelapsed = stopwatch.Elapsed.TotalSeconds <= 60
? stopwatch.Elapsed.TotalSeconds + " seconds"
: Math.Round(stopwatch.Elapsed.TotalSeconds/60) + " minutes";
MessageBox.Show(string.Format("Time elapsed {0}", timeelapsed));
conn.Close();
}
我尝试过的事情:
- 使用文件数据库而不是内存数据库。
- 使用
BEGIN TRANSACTION
和COMMIT TRANSACTION
[如代码所示]。 - 使用Firefox扩展程序
SQLite Manager
测试脚本是否导致速度变慢;然而,令我惊讶的是,用我的代码处理的相同20,000
行数据只需在4毫秒内从数据库中提取! - 使用
PRAGMA synchronous = OFF
和PRAGMA journal_mode = MEMORY
。 - 向
.sql
文件的开头和结尾添加BEGIN TRANSACTION
和COMMIT TRANSACTION
。
正如SQLite文档所说:SQLite每秒可以处理50,000
个命令。这是真实的,我通过SQLite Manager
[如第三个尝试中所述]确保了这一点;但是,我需要4分钟左右才能完成20,000
个命令,这表明存在问题。
问题:我面临的问题是什么,为什么执行非常缓慢?!