工作几年了,长进不大。在项目中总遇到这样的情况。刚开始工作:
两个数据库,将一个库中的数据插入到另外一个库中。(肯定不能在数据库操作,因为有业务逻辑。)我就通过SQL先到一个库查询得到DataSet,再循环这个DataSet插入到另外一个库中。数据量不大几百条吧,速度还可以。总想优化下,但不知道啥合适的方案。现在工作中:
比以前难度加大。同样是两个数据源,同样不能数据库同步。因为一个是webService获取的XML.我先将XML变成实体类。然后在查本地数据库,查询结果是同样的实体类。这实体类有个主键。然后我就循环、嵌套循环。判断本地库中是否有不存在的XML中的数据。取出结果后。我再循环插入数据库,天啊。。百万条数据,插入好慢啊。开多个线程效果也不是特别明显。加入您在项目中遇到这种情况您会怎么处理呢?谢谢
两个数据库,将一个库中的数据插入到另外一个库中。(肯定不能在数据库操作,因为有业务逻辑。)我就通过SQL先到一个库查询得到DataSet,再循环这个DataSet插入到另外一个库中。数据量不大几百条吧,速度还可以。总想优化下,但不知道啥合适的方案。现在工作中:
比以前难度加大。同样是两个数据源,同样不能数据库同步。因为一个是webService获取的XML.我先将XML变成实体类。然后在查本地数据库,查询结果是同样的实体类。这实体类有个主键。然后我就循环、嵌套循环。判断本地库中是否有不存在的XML中的数据。取出结果后。我再循环插入数据库,天啊。。百万条数据,插入好慢啊。开多个线程效果也不是特别明显。加入您在项目中遇到这种情况您会怎么处理呢?谢谢
我一般大数量处理都是用这个类去处理,你可以尝试下
第二个问题 我木有看懂 ,随手帮你顶下吧!
2.不直接和数据库对比,所有操作在dataset中完成,再用dataApater.update
比如写一个方法
public void write(string str)
{
}
这个方法的目的就是在本地生成一个txt记事本 ,然后将str添加到这个记事本中
这个str就是你手动生成的sql比如
write("insert XX values("+a+","+b+")")........
我就在程序里直接根据条件判断,有这条数据就更新,没有就插入。将这个判断和更新插入语句拼接到程序里,然后将拼接好了的字符串一次性传给数据库处理,不过也不是很快,我这里是3万多条数据差不多用了3-5分钟。楼主,你不嫌慢的话可以参考一下。
其实就算对传统数据库,哪怕是MySql,百万条数据根本就不算什么。
你的问题其实是处理和存储的逻辑没有协调好,和SqlBulkCopy什么的没关系。
处理的速度慢,插入的速度快,但你是在循环中等处理完再去插入,感觉上就是数据库操作慢了。提高速度的访问就是开个线程池来处理数据,处理一批后,比如一万条,触发事件,让写线程去写数据库,这时可以用事务或上面说的SqlBulkCopy什么的。有可能整体速度并没有提高太多,但很明显数据库的压力小多了。不管是Sql server,Mysql,更不用说Oracle,单纯地insert,update处理个百万条数据是很轻松的事情。如果有感觉很耗时,很慢的情况,都是耗在了逻辑处理上。把逻辑处理和数据库的访问的关系处理好效率就自然提高了。