批量修改10W条数据的优化方案,求赐教 我在批量修改数据的操作时,表中有10万条数据,我需要对它某个字段的值重新生成,开始我是采用FOR循环的方式,但这种方式带来的后果是,程序正在执行的时候,CPU使用率急速飙升,然后程序变成无响应(当然,程序仍然在运行),花了好长时间等待程序修改结束,程序才会恢复正常,这样的话,感觉太恶心了,没有人愿意用的。希望各位大牛赐教两招 优化方案,至少不要出现CPU使用率急速飙升,程序变成无响应 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 update table set xx=xxx where 条件update tablea a set a.xx=b.xxx from tableb b where a.id=b.id and a.xx=....不一定要用for吧 你这个情况可以加个进度条然后加一句APPLICATION.DOEVENT()方法来重绘下窗体就不会假死了,或用线程去运行FOR循环中的SQL操作使用SQL储存过程去做这种修改操作 用backgroundWorker控件 这个就是后台线程 网上查下具体用法 很简单的http://topic.csdn.net/u/20091113/11/dd15d33e-8da3-4d8b-a166-74f0cbea8eda.html 一般说了,如果大量数据更新的话,犹豫再事务提交之前都需要记录在内存里并整理出回滚信息,所以比较慢。通常的做法是 一次少更新点,比如每次更新1万条。 千万不要都读到dataset里面一条一条更新。这样网络数据量太大app的内存也需要很多。如果能直接在数据库里面修改,比如根据一个表修改另外那个表的数据,就不要弄到程序里更新了。另外问问你用的什么数据库。据我的经验10万数据库的修改是很轻松的事。除非你的数据库设计的不科学。 顶这个,配合Control.Invoke 来处理控件更新 我这样解释下吧,假设数据表模型如下,有10W或更多这样的数据表明为 table1主键a 字段b 序号c1 行政部 00013 行政部 00023 行政部 00034 刑事部 00045 刑事部 00056 刑事部 00067 财务部 00078 财务部 00089 财务部 0009.... .... ....我要做的操作就是,序号c的值要全部重新生成规则是:字段b 为行政部的,序号c要从0001开始往上加 规则是:字段b 为刑事部的,序号c要又重新从0001开始往上加,依次类推我的修改的SQL语句是这样写的update table1 set 序号c = 参数1 where 字段b = (select top 1 字段b from table1 where 字段b=参数2 and 主键a not in (select top 参数3 主键a from table1 where 字段b=参数2))参数1:要修改的字段值.参数2:根据字段b 下的那个值来生成,传进来的值是行政部、刑事部或是财务部参数3:要从第几条数据开始取这句SQL的 的后面的两个SELECT,其实就是个分页查询,如果三个参数的值为:0003,刑事部,2那么这句SQL就是 查询出字段b为‘刑事部’的结果集,并修改第3条记录的 序号c为0003然后外面在给他包个循环 ,请各位大牛们,能给于 一些点评 我用的是ACCESS数据库,不支持T-SQL 呵呵,这个问题已经解决了,多谢各位的意见我自己开了一个后台线程,把SQL重新优化了一下,OK了,现在界面也不会卡死,CPU的使用率也在50%左右在自己家里的电脑上跑的话,同样是10W条数据,CPU使用率则是在20-30%之间呵呵,多线程 还是个好东西啊还有一问就是,后台线程在慢慢改数据的时候,我又想在主线程操作如果主线程的操作量比较大的话,那么屏幕又会假死,我现在想这样当我在主线程中要进行某个操作的话,如查询,我就想把那个后台线程给挂起等我的查询操作结束以后 ,在继续那个后台线程敢问如何实现呢? not in 会执行全表扫描不慢才怪 c# 中 DataTable.Select 模糊查询问题 DataGridView 问题大汇总 为何出现“无法创建目录或文件”的错误 每次点击按钮在datagrid新增一行 关于winform listview控件显示数据重叠问题 asp.net(c#)发布后无法插入更新数据 在线程中如何打开一个Form窗体,关闭已经打开的窗体? Vss 2005 的 Internet访问问题,急待解决 请问我要异步加载一个datatable进入一个gridcontrol怎么操作? A.关于全局常量;B.关于C#中的函数是否需要声明 C#特效 C# 在winform中怎样处理usercontrol按钮事件
使用SQL储存过程去做这种修改操作
http://topic.csdn.net/u/20091113/11/dd15d33e-8da3-4d8b-a166-74f0cbea8eda.html
顶这个,配合Control.Invoke 来处理控件更新
表明为 table1
主键a 字段b 序号c
1 行政部 0001
3 行政部 0002
3 行政部 0003
4 刑事部 0004
5 刑事部 0005
6 刑事部 0006
7 财务部 0007
8 财务部 0008
9 财务部 0009
.... .... ....我要做的操作就是,序号c的值要全部重新生成
规则是:字段b 为行政部的,序号c要从0001开始往上加
规则是:字段b 为刑事部的,序号c要又重新从0001开始往上加,依次类推我的修改的SQL语句是这样写的
update table1 set 序号c = 参数1 where 字段b =
(select top 1 字段b from table1 where 字段b=参数2 and 主键a not in
(select top 参数3 主键a from table1 where 字段b=参数2))参数1:要修改的字段值.
参数2:根据字段b 下的那个值来生成,传进来的值是行政部、刑事部或是财务部
参数3:要从第几条数据开始取
这句SQL的 的后面的两个SELECT,其实就是个分页查询,如果三个参数的值为:0003,刑事部,2
那么这句SQL就是 查询出字段b为‘刑事部’的结果集,并修改第3条记录的 序号c为0003然后外面在给他包个循环 ,请各位大牛们,能给于 一些点评
我自己开了一个后台线程,把SQL重新优化了一下,OK了,现在界面也不会卡死,CPU的使用率也在50%左右
在自己家里的电脑上跑的话,同样是10W条数据,CPU使用率则是在20-30%之间
呵呵,多线程 还是个好东西啊还有一问就是,后台线程在慢慢改数据的时候,我又想在主线程操作
如果主线程的操作量比较大的话,那么屏幕又会假死,我现在想这样
当我在主线程中要进行某个操作的话,如查询,我就想把那个后台线程给挂起
等我的查询操作结束以后 ,在继续那个后台线程
敢问如何实现呢?