解决方案 »

  1.   

    表有多少数据?update语句不需要任何条件吗?
      

  2.   

    我看了一下,实际上一条数据都没有更新到,sql server studio看起来还在跑跑跑(“正在执行查询”)
      

  3.   

    select COUNT(1) from tablename是聚集表或者是有索引的话,我估计没那么慢但是你一下子更新600W条数据的话,普通的服务器的话,真的有点扛不住,我也不知道如何“优化”了
    建议如果真的要更新的话,将数据库设置为简单恢复模式,还有就是能不能想办法一部分一部分的分批去更新?
      

  4.   

    1、为什么不查系统提供的视力。Sys.Partitions
    2、既然数据量大,那只有提高IO(分享日志与数据到独立磁盘上)能力
      

  5.   

    luckyrandom :
    1.Sys.Partitions这个是不是只能查看表有多少条数据等,没有更新数据的功能是吧?
    2.提高IO能力,具体怎么做呢,能不能指点一二?
      

  6.   

    update是一个整体事务,没有提交或者回滚前都不会直接影响数据库的数据。如果不需要条件update,可以考虑下面步骤:1. 备份这个表。2.select xxxx,REPLACE(DOCKEYVAL, '001,', '141,') as DOCKEYVAL ,XXXX into #t FROM 你的表,其中xxx就是不需要更新的列,保持表结构的列名一致。3. truncate table 你的表 4. insert into 你的表(列一一对应) select * from #t 
      

  7.   

    问题1:
    在你的主键上添加一个非聚集索引
    问题2
    方案1:先干掉与这个字段相关的索引,然后做update动作后再把索引重建上去,缺点这样其他用户要同时使用这个表就不行了
      

  8.   

    方案2:使用update top(n)  +wait for delay  的方式批量替换n不要大于1000,每更新一批次记录对应PK值,到临时表,下批次就可以排除掉。优点不会影响其他用户的各种操作,缺点速度慢。
      

  9.   

    方案3:创建一个新表,然后把数据导入过来,用switch to会很省时间例如下面脚本
    然后在这张表上进行各种操作就不影响其他用户了,update完毕以后,用 tablediff 方式对比是否有差异,并处理,再通过sp_rename的方式切换回去,最后用 tablediff 确认没有其他修改,工作就完成了。
    老是提示发帖错误- -我就分多次发帖了
      

  10.   

    select * into BAS_AUDITRCRD_OLD151 from (select * from (select ROW_NUMBER() over (order by asnm) num,* from BAS_AUDITRCRD_OLD) t where num between 1500001 and 1510000) p;
    我现在用这种方式来分批把数据导入新表,然后更新表,然后再插回去