插入时间过长,需要进行代码优化

时间:2010-01-22 23:46:03

标签: c# optimization sqlite compact-framework transactions

我使用了一些代码将table1值转移到另一个table2,它们位于不同的数据库中。

当我有100.000条记录时,它很慢。它需要永远完成,超过10分钟。

(Windows Mobile智能手机)

我该怎么办?

cmd.CommandText = "insert into " + TableName + " select * from sync2." + TableName+"";  
cmd.ExecuteNonQuery();

编辑

问题未解决。我仍然在回答。

7 个答案:

答案 0 :(得分:4)

1]您可以在connectionString

中设置以下参数
string connectionString = @"Data Source=E:\myDB.db3; New=true; Version=3; PRAGMA cache_size=20000; PRAGMA page_size=32768; PRAGMA synchronous=off";

有其自身的局限性。查看this link了解详情

以上内容最终会增加缓存大小(cache_size& page_size),但如果强制关闭系统(同步=关闭),可能会丢失一些数据。

2]您可以将insert语句包装在像

这样的事务中
dbTransaction = dbConnection.BeginTransaction();
dbCommand.Transaction = dbTransaction;
// your individual insert statements here
dbTransaction.Commit();

3]还有一个技巧在this page中得到了很好的解释。看看

希望有所帮助 干杯!

答案 1 :(得分:1)

据我所知,您每行使用两个SQL语句 - 一个用于插入,另一个用于更新整个表。您需要更新整个表,还是只更新要插入的行?如果没有,您可以首先将dirty设置为0的行插入。

您还可以尝试将ad-hoc insert语句更改为准备/编译/参数化语句。在一些提供小速度提升的数据库引擎中。

SQLite常见问题解答here中列出了一些改进选项。

最后,你知道你的瓶颈是什么吗?我对移动电话应用程序的性能了解不多 - 您的分析是显示您受CPU限制还是“磁盘”限制,无论该特定电话上的磁盘通过了什么?

答案 2 :(得分:0)

我认为您可以使用DataTable(我认为 - 或者它是DataSet?抱歉,仍然是.NET中的初学者),然后是.Fill() Reader'将结果导入DataTable,然后有BulkCopyBulkInsert操作,可以将其全部推送到另一个数据库(连接)中的表中。

答案 3 :(得分:0)

可能有帮助的一个建议(尽管您需要对此进行分析)可能是为多个记录调用插入或替换命令一次,具有多个值。这会批量调用数据库,这可能会加快速度。

此外,听起来你正在从一个数据库复制到另一个数据库 - 如果新数据库中不存在这些记录,你可以使用INSERT而不是INSERT OR REPLACE,这在(至少在理论上)更快。

然而,这些都不会引人注目 - 这可能仍然是一个缓慢的操作。

答案 4 :(得分:0)

不是单独执行语句,而是可以构建字符串,然后作为批处理立即执行,或者查看批处理更新。

或者你可以把这一切都作为一个可能更有效的陈述来做,这就是我的意思:

http://forums.mysql.com/read.php?61,15029,15029

我希望这会有所帮助。

答案 5 :(得分:0)

嗯,您正在为每个插入使用查询处理器。使用命令,向其添加参数,准备它,然后在循环中设置参数会更好。

我不知道SQLite是否支持TableDirect命令。如果它确实如此,方式,方式更快(例如,SQL Compact中的速度提高了几个数量级)。这当然值得一试。

答案 6 :(得分:0)

  1. 如果直接在SQL管理工作室中执行此操作,sql语句是否还需要10分钟?
  2. 如果没有,您是否尝试使用SQL过程并执行它?
  3. 您是否尝试设置连接池和/或使光标服务器站在一边?
  4. 运行SQL分析器(您可以从管理工作室调用它),如果1.很慢并在那里添加事务队列。