用个数据库需要清理下数据。
这张表共200左右字段,共800多万数据。现在需要清理掉一些老数据,估计有300-400万。
刚才在本地执行了下,删除的速度不是一般的慢。各位高手 对于删除数据有什么好的方法!DELETE tbit WHERE RepairDate<'2008-12-01'
--约300-400万数据

解决方案 »

  1.   


    比如,在一个时时访问的库下删除指定数据:
    while exists
    (select top 1 1 from tbit WHERE RepairDate<'2008-12-01')
    begin
    waitfor delay '00:00:01'
    delete top (10000) tbit with(rowlock) from tbit 
    with(index=RepairDate列的索引) where RepairDate<'2008-12-01'
    option(maxdop 1)
    end
      

  2.   

    while 1=1
    begin 
    delete top (10000)  from tb  where RepairDate<'2008-12-01';
    if @@rowcount<10000 break;
    end
    这样日志就涨不了了
      

  3.   

    这个表上如果删除400万数据后剩余的行数很少,可以将剩余行数复制到一个新表。将旧表drop掉,然后把新表的名字再改成旧表的。 
      

  4.   


    这样的数据最好定时JOB删除,累积到后面删除会死人的。
      

  5.   


    ALTER DATABASE database_name  SET RECOVERY SIMPLE
      

  6.   

    谢谢!
    也可以:数据库->属性->选项->故障还原
      

  7.   

    1.drop 表
    2.create 表
    3.插入数据
    4.建索引
      

  8.   

    看来还是sql server 2000 啊
      

  9.   

    --2000
    set rowcount 10000;
    while 1=1
    begin 
    delete from tb where RepairDate<'2008-12-01';
    if @@rowcount<10000 break;
    end
    set rowcount 0;
      

  10.   

    要我就用 楼上写的 WHILE 1=1  , 
      

  11.   

    改成大容量模式可能会更安全些。不要心血来潮删数据,应该定时删数据。可以考虑导入新表,然后DROP 旧表,再将新表改名回旧表名。
      

  12.   

      【个人学习笔记9之--TOP 和APPLY 】 收藏 
     这篇来说说TOP 和APPLY 
    1.TOP
    一般来说 我们的TOP 和 ORDER BY 是一起连用的 这样可以返回确定的行 你可以看做是一个筛选器,可以再表表达式中使用。
    SQL 2005 TOP 后面支持连接 变量 算术表达式 子查询结果. 
    在2000里 只支持后面具体数字 如果想在2000中使用类似TOP (@n)的功能 参考http://blog.csdn.net/feixianxxx/archive/2009/08/03/4405684.aspx
    这里有个小知识点: WITH TIES 。
    create table # (a int)
    insert # select 
    1 union all select
    2 union all select
    2 union all select
    3 union all select
    3 union all select

    select top (4) A from # order by a
    /*
    A
    -----------
    1
    2
    2
    3
    */
    select top (4) with ties A from # order by a
    /*
    A
    -----------
    1
    2
    2
    3
    3
    */
    --使用了WITH TIES 后 将生成额外的行,多出来的行是与最后返回行相同的值 例子里是3
    SQL2005支持TOP出现在INSERT UPDATE DELETE 后面 控制操作的行数,比如 insert top(10) into tb select * from .....
    不过可惜ORDER BY不能用于这些结构中,这样你也许会觉得无法控制。倒是有方法可以控制:
    插入:insert tb select top (n) * from .... order by ....
    删除:with cte as
    (
     select top(10) * from ... order by ...
    )
    delete from  cte
    修改: with cte as
    (
     select top(10) * from ... order by ...
    )
    update cte set ......
    实际小问题:
    工作中有时候需要清理历史数据的时候,往往数据量达到了几百万.这个时候采用一次性删除的方法是很不明智的:
    a.delete操作会被完整记录到日志里,它需要大量空间和时间;
    b.如果删除中间发生中断,一切删除会回滚(在一个事务里);
    c.同时删除多行,记录上的锁也许会被提升为排它表锁,从而阻碍操作完成之前有对这个表的操作(有时候会妨碍正常的业务)
    所以一般采取分批删除的方法.
    sql2000:通过set rowcount 来控制每次删除的记录数
    SET ROWCOUNT 5000;
    WHILE 1 = 1
    BEGIN
      DELETE FROM dbo.LargeOrders
      WHERE OrderDate < '19970101';  IF @@rowcount < 5000 BREAK;
    END
    SET ROWCOUNT 0;
    sql2005:通过TOP的方法
    WHILE 1 = 1
    BEGIN
      DELETE TOP(5000) FROM dbo.LargeOrders
      WHERE OrderDate < '19970101';  IF @@rowcount < 5000 BREAK;
    END
    -----------------本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/feixianxxx/archive/2009/10/29/4744559.aspx
      

  13.   

    NND多贴了。。不好意思 实际小问题:
    工作中有时候需要清理历史数据的时候,往往数据量达到了几百万.这个时候采用一次性删除的方法是很不明智的:
    a.delete操作会被完整记录到日志里,它需要大量空间和时间;
    b.如果删除中间发生中断,一切删除会回滚(在一个事务里);
    c.同时删除多行,记录上的锁也许会被提升为排它表锁,从而阻碍操作完成之前有对这个表的操作(有时候会妨碍正常的业务)
    所以一般采取分批删除的方法.
    sql2000:通过set rowcount 来控制每次删除的记录数
    SET ROWCOUNT 5000;
    WHILE 1 = 1
    BEGIN
      DELETE FROM dbo.LargeOrders
      WHERE OrderDate < '19970101';  IF @@rowcount < 5000 BREAK;
    END
    SET ROWCOUNT 0;
    sql2005:通过TOP的方法
    WHILE 1 = 1
    BEGIN
      DELETE TOP(5000) FROM dbo.LargeOrders
      WHERE OrderDate < '19970101';  IF @@rowcount < 5000 BREAK;
    END
    -----------------
      

  14.   

    别提了。接手别人的项目。数据库设计那是相当的强啊!
    得大量的使用 not in