我在批量修改数据的操作时,表中有10万条数据,我需要对它某个字段的值重新生成,开始我是采用FOR循环的方式,但这种方式带来的后果是,程序正在执行的时候,CPU使用率急速飙升,然后程序变成无响应(当然,程序仍然在运行),花了好长时间等待程序修改结束,程序才会恢复正常,这样的话,感觉太恶心了,没有人愿意用的。希望各位大牛赐教两招  优化方案,至少不要出现CPU使用率急速飙升,程序变成无响应

解决方案 »

  1.   

    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吧 
      

  2.   

    你这个情况可以加个进度条然后加一句APPLICATION.DOEVENT()方法来重绘下窗体就不会假死了,或用线程去运行FOR循环中的SQL操作
    使用SQL储存过程去做这种修改操作
      

  3.   

    用backgroundWorker控件 这个就是后台线程 网上查下具体用法 很简单的
    http://topic.csdn.net/u/20091113/11/dd15d33e-8da3-4d8b-a166-74f0cbea8eda.html
      

  4.   

    一般说了,如果大量数据更新的话,犹豫再事务提交之前都需要记录在内存里并整理出回滚信息,所以比较慢。通常的做法是 一次少更新点,比如每次更新1万条。 千万不要都读到dataset里面一条一条更新。这样网络数据量太大app的内存也需要很多。如果能直接在数据库里面修改,比如根据一个表修改另外那个表的数据,就不要弄到程序里更新了。另外问问你用的什么数据库。据我的经验10万数据库的修改是很轻松的事。除非你的数据库设计的不科学。
      

  5.   


    顶这个,配合Control.Invoke 来处理控件更新
      

  6.   

    我这样解释下吧,假设数据表模型如下,有10W或更多这样的数据
    表明为 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然后外面在给他包个循环 ,请各位大牛们,能给于 一些点评
      

  7.   

    我用的是ACCESS数据库,不支持T-SQL
      

  8.   

    呵呵,这个问题已经解决了,多谢各位的意见
    我自己开了一个后台线程,把SQL重新优化了一下,OK了,现在界面也不会卡死,CPU的使用率也在50%左右
    在自己家里的电脑上跑的话,同样是10W条数据,CPU使用率则是在20-30%之间
    呵呵,多线程 还是个好东西啊还有一问就是,后台线程在慢慢改数据的时候,我又想在主线程操作
    如果主线程的操作量比较大的话,那么屏幕又会假死,我现在想这样
    当我在主线程中要进行某个操作的话,如查询,我就想把那个后台线程给挂起
    等我的查询操作结束以后  ,在继续那个后台线程
    敢问如何实现呢?
      

  9.   

    not in 会执行全表扫描不慢才怪