【发布时间】:2013-02-12 15:28:19
【问题描述】:
我有一个file.sql,其中包含20,000 的插入命令
来自.sql 文件的示例
插入
table值 (1,-400,400,3,154850,'Text',590628,'TEXT',1610,'TEXT',79);插入
table值 (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();
}
我尝试过的事情
- 使用文件数据库而不是内存数据库。
- 使用开始事务和提交事务 [AS SHOWN IN MY CODE]。
- 使用Firefox的扩展名为
SQLite Manager来测试是否 减速问题来自脚本;然而,我很惊讶 我尝试使用我的代码处理的相同20,000行 已在 4 毫秒内被拉入数据库!!!。 - 使用
PRAGMA synchronous = OFF,以及PRAGMA journal_mode = MEMORY。 - 将
begin transaction;和commit transaction;附加到.sql文件的开头和结尾。
正如 SQLite 文档所说:SQLite 能够每秒处理 50,000 命令。这是真实的,我使用SQLite Manager [如我尝试的第三件事中所述] 确定了这一点;但是,我在 4 分钟内完成了我的 20,000 命令,这表明有问题。
问题:我面临什么问题,为什么执行速度非常慢?!
【问题讨论】:
-
您是否尝试过在事务对象之后创建命令对象?
-
我认为这是我的代码中所做的??
-
您是否尝试了解 ReadAllText 方法需要多长时间?
-
只需要一秒钟,因为当我尝试调试程序时它只会停止不到一秒钟
-
在您的代码中,您先调用
new SQLiteCommand(conn),然后再调用conn.BeginTransaction()。尝试在这两行之间切换,看看会发生什么。