2010-01-22 54 views
0

我使用一些代码将table1值转换为另一个table2,它们坐在不同的数据库中。插入时间过长,需要优化代码

当我有100.000条记录时速度很慢。它需要永远完成,10分钟以上。

(Windows Mobile智能手机)

我能做些什么?

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

编辑

的问题没有得到解决。我仍然在回答。

+0

你的意思是100.000或100,000(如在十万)?对分隔符使用小数点会让程序员(以及大多数人)感到困惑 – Earlz 2010-01-22 23:57:23

+1

目标表是否有索引?它有多少行? – 2010-01-22 23:58:48

+0

我的意思是100000.目标表是空的。 – Pentium10 2010-01-23 00:20:52

回答

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]你可以用一个事务中插入语句时,这样

dbTransaction = dbConnection.BeginTransaction(); 
dbCommand.Transaction = dbTransaction; 
// your individual insert statements here 
dbTransaction.Commit(); 

3]还有一个窍门这是在this page很好的解释。看看它

希望可以帮助
干杯!

+2

第二喜欢破碎。 – Vlad 2015-06-23 22:56:53

0

我想你可以使用一个DataTable(我认为 - ?抑或是DataSet对不起,.NET还是一个初学者),然后.Fill()Reader的结果成DataTable,然后有一个BulkCopyBulkInsert操作,可以将它全部推送到另一个数据库(连接)中的表中。

+0

你能告诉我一些代码示例吗? – Pentium10 2010-01-23 00:22:17

0

一个建议,这可能会有所帮助(尽管您需要对此进行简要描述),可能会调用插入或替换命令一次为多个记录创建多个值。这样可以将调用分批发送到数据库,这可能会加快速度。

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

但是,这些都不会很戏剧性 - 但这可能仍然是一个缓慢的操作。

+0

据我所知,SQLite不支持多个值。其实有两种情况。第一次,记录不会存在。纯插入更好,但第二次他们会和我需要插入或替换。 – Pentium10 2010-01-23 00:23:37

1

据我所知,您每行使用两条SQL语句 - 一条插入它,然后另一条更新整个表。你需要更新整个表格,还是只更新你插入的行?如果没有,你可以插入dirty设置为0的那一行。

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

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

最后,你有没有想过你的瓶颈是什么?我对手机应用程序的性能了解不多 - 您的配置文件是否显示您受到CPU绑定或“磁盘”限制,无论该特定手机上的磁盘通过何种通行证?

+0

完成该过程后,我必须为所有记录设置脏0。我不知道参数化查询是否会对我有所帮助,因为表模式是可变的,我不知道固定列。在移动设备上,CPU和DISK都是瓶颈。可能磁盘更多。 – Pentium10 2010-01-23 00:26:03

0

不是单独执行这些语句,您可以建立字符串,然后一次执行一个批处理,或者查看批处理更新。

或者你可以做到这一切作为一个声明,可能会更有效,这样的事情是我的意思:

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

我希望这有助于。

+0

你可以请更精确,请保持与SQLite。批量更新在sqlite上很少见。 – Pentium10 2010-01-23 00:46:46

+0

你可以通过这样做来摆脱循环: insert into ???选择 ???从??? – Burt 2010-01-23 01:47:25

+0

他正在处理两个不同的数据库,而不是同一个数据库中的两个表。 – 2010-01-23 02:31:04

0

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

我不知道SQLite是否支持TableDirect命令。如果这样做会更快(例如,SQL Compact的速度要快几个数量级)。这当然值得一试。

+0

根据该页面的注释: TableDirect仅受OLE DB的.NET Framework数据提供程序支持。当CommandType设置为TableDirect时,不支持多表访问。 – Pentium10 2010-01-23 08:37:55

+0

你能告诉我一些Parameteres的代码示例吗? – Pentium10 2010-01-23 08:38:26

0
  1. 如果直接在SQL管理工作室中执行此操作,sql语句是否也需要10分钟+?
  2. 如果不是,您是否尝试使用SQL过程并执行它?
  3. 您是否尝试设置连接池和/或将光标服务器设置为双面?
  4. 运行SQL事件探查器(您可以从管理工作室调用它)如果1.很慢并且在那里添加事务队列。