首页 新闻 赞助 找找看

十万多条数据的处理

0
悬赏园豆:10 [已关闭问题] 关闭于 2013-07-11 15:14

有十万多条数据 需要从Oracle 中查询出来  并在C#程序中做处理之后  插入Oracle的另外一张表

  而且需要效率高些  ,

目前的思路 是查询出来 返回到DataSet中  循环DataSet 做处理 并插入另一张表

 

但是 十多万条数据 查询到到DataSet中会很慢,而且容易卡死  还有循环DataSet更慢  

 

希望有好的解决方案 求教育

  

UUVVW的主页 UUVVW | 初学一级 | 园豆:184
提问于:2013-05-30 18:02
< >
分享
所有回答(7)
0

首先,不管用什么方法我觉把10万条数据一起取出来在处理不太合适,可以一次处理少量数据,如1000条,第二次才处理1001到2000条,以此类推。

会长 | 园豆:12401 (专家六级) | 2013-05-30 18:21

或者同时启动过个线程,每个线程负责1000条,这样应该可以快些。

支持(0) 反对(0) 会长 | 园豆:12401 (专家六级) | 2013-05-30 18:23

@会长: 起动100个线程和启动1个线程的比反而慢..因为数据库插入是在一个事务中的

支持(0) 反对(0) 56180825 | 园豆:1756 (小虾三级) | 2013-05-30 20:20

@56180825: 你说的对

支持(0) 反对(0) 会长 | 园豆:12401 (专家六级) | 2013-05-30 20:40
0

使用CYQ.Data+ODP.NET方式,10万条数据,操作也就是N秒的时间,很快的。

类似代码:

MDatatable table=null;

using(MAction action=new MAction("表名A"))

{table=action.Select();}

foreache(MDatarow row in table.Rows)

{对数据进行修改。}

table.TableName="表名B";

table.AcceptChanged(Op.InsertWithID);

 

搞定。

路过秋天 | 园豆:4787 (老鸟四级) | 2013-05-30 22:59
0

用存储过程吧!!不过就是太定向了,不通用,也不好扩展,只能定向写。

二十三号同学 | 园豆:974 (小虾三级) | 2013-05-31 09:10
0

如果只导入一次,用存储过程比较合适。

也可通过sqldatareader 以只读的方式迁移数据。(减少内存占用) , 这种方式还是会卡死, 因此将这个过程放在非主线程中做.

仰光 | 园豆:249 (菜鸟二级) | 2013-05-31 10:00
0

OracleBulkCopy.

 

public void WriteToServer( OracleConnection oracleConnection, string qualifiedDBName, DataTable dataTable )
{
 try
 {
   using ( OracleBulkCopy bulkCopy = new OracleBulkCopy( oracleConnection ) )
   {
     bulkCopy.DestinationTableName = qualifiedDBName;
     bulkCopy.WriteToServer( dataTable );
   }
 }
 catch ( Exception exc )
 {
  LogException( exc, MethodBase.GetCurrentMethod( ) );
  throw;
 }
}
数据酷软件 | 园豆:130 (初学一级) | 2013-05-31 10:37
0

可以直接写存储过程吧,也能处理你的需求。如果需求不是很复杂,建议直接将原表查处来直接写入新的表。

Wolfe Yu | 园豆:434 (菜鸟二级) | 2013-05-31 17:37
0

select from #table1 into #table2

程序诗人 | 园豆:313 (菜鸟二级) | 2013-06-04 15:48
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册