我使用了一些代码将table1
值转移到另一个table2
,它们位于不同的数据库中。
当我有100.000条记录时,它很慢。它需要永远完成,超过10分钟。
(Windows Mobile智能手机)
我该怎么办?
cmd.CommandText = "insert into " + TableName + " select * from sync2." + TableName+"";
cmd.ExecuteNonQuery();
编辑
问题未解决。我仍然在回答。
答案 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
,然后有BulkCopy
或BulkInsert
操作,可以将其全部推送到另一个数据库(连接)中的表中。
答案 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)