我用1W 条数据测试了,可以运行现在运行实际的1000W 条数据,运行到2个小时的时候tempdb.mdf和tempdb.mdf 都不动了(我执行过其他表的操作),CPU 也只有2%,就是内存在上下浮动,
但是在窗口那里面还显示“正在执行查询”这个是怎么回事,已经快3个小时了。急死人,我关还是不关?

解决方案 »

  1.   

    看看是否有其他进程阻塞了,比如占用了这个表,你的update就只能等待。甚至可能死锁了。
    select * from sys.sysprocesses where blocked<>0
    看看里面有没有数据,有就是阻塞了。
      

  2.   

    sp_who 看下你执行的更新有没有被阻塞。blk 列里是否有值
      

  3.   

    加个where条件一批一批更新试试,按你的现状貌似都没开始更新呢。
      

  4.   

    update tb set col='xx' where ...
    waitfor delay '00:00:20'
      

  5.   

    循环批次更新
    declare @i int=5000 
    while (@i=5000)
    begin
          update tb set col='xx' 
          where col is null
          set @i=@@ROWCOUNT
          waitfor delay '00:00:05'
    end若where无法避免重复更新,就创建临时表,记录更新过的主键
      

  6.   


    这样一次连接里的循环,无法避免日志持续变大吧
    不但waitfor没有用,曾经试过,就是用commit也会持续变大
      

  7.   

    WHILE 1 = 1
    BEGIN
      UPDATE TOP(5000) dbo.LargeOrders
        SET CustomerID = N'ABCDE'
      WHERE CustomerID = N'OLDWO';  IF @@rowcount < 5000 BREAK;
    END
    GO
      

  8.   

    可以防止锁升级,而且这样完成5000条就认为是完成了一个事务,checkpoint时就会写入数据库
    ,也就是数据是分批写入的。而一条语句的话,整个更新就是一个事务,需要在全部完成之后才写入,性能区别是很大的
      

  9.   

    http://topic.csdn.net/u/20121031/18/f7328c3c-2f05-4f11-a6cc-3c3143f900ff.html同时帮忙看看这个问题