找个周末,把c盘空间准备大大的,数据所在空间准备大大的,收缩好日志,UPS点充得足足的,然后money准备得足足的,执行操作,下班走人,开开心心去寻找艳遇,星期一回来收工。

解决方案 »

  1.   

    将一个更新划分为几个批次 
     
     
     
    更新日期: 2003年4月14日  
      
     
     
     
    本技巧摘自SQL Server杂志的一期。如需了解更多的技巧,请访问SQL Server的使用技巧中心。问:我想以一次5,000行的方式批量更新一个大型表,但我不知道怎样分割数据。该表不包含增量数字或整数主键。怎样才能在保持良好性能的同时实现数据更新呢?答:如果知道哪些行尚未被更新,您可以使用简单的谓词来排除已更新的行,ROWCOUNT设置可以帮助您批量分割数据。以下的代码清单说明了如何使用该设置:SET ROWCOUNT 1000 
    WHILE (1=1) BEGIN 
       BEGIN TRANSACTION 
       UPDATE...set ...,MyLastUpdate='date',...WHERE 
         MyLastUpdate < 'date' 
         -- 更新1000未更新行
       IF @@ROWCOUNT = 0 
       BEGIN 
        COMMIT TRANSACTION 
        BREAK 
       END 
       COMMIT TRANSACTION 
    END 在指定的行数返回后,ROWCOUNT将使SQL Server停止查询处理。这项技术很有用,因为它避免了大量更新所致的并发命中;更新中的行数越少,更新任务使其他用户不能访问该数据的可能性就越小。结合事务日志备份,这一方法还可以使您的事务日志的大小降至最低。如果没有识别已更新行的机制,您可以使用游标遍历所有数据并提交每个x值。但是,游标占用服务器资源的时间通常要多于基于集合的语句。—Microsoft SQL Server开发团队返回使用技巧页。
     
      

  2.   

    楼上兄弟的方法确实很不错,但我现在的实际问题是我首先要将数据库中符合条件的记录先从原表中select出来记录插入到另一个新表中,然后将被select出来的记录从原表删除。而且原表还在不停的插入记录,不排除原表select完成之后又有新的符合select条件的记录被插入。这样就存在一个问题,比如select1000条插入到一个新表,在插入完成跟删除操作之间,又有新的符合刚才条件的记录被插入,这样删除就误删了一些记录,这个问题怎么解决啊?要保证删除的记录跟select出来插入新表的记录一样。
    多谢!!