解决方案 »

  1.   

    将14年以后的数据导入到临时表 然后TURNCATE 整个表 然后再将临时表的数据导入到这个表
      

  2.   

    这个线上的表,不能turncate表的
      

  3.   

    以前试过,删除用Job+循环语句执行,删除了2、3天楼主可以试尝这方法,每次删除1000条记录
      

  4.   

    现在就是这么做的,千万级的数据,删起来很缓慢,
    有资源竞争的话一次job的时间由几分钟拉长到几十分钟,
    有没有什么更高效的方法?
      

  5.   

    上次ORACLE里面有个2-3亿行记录的删除情况。写个作业吧。
    比如把时间作为变量。先取出来最小时间。
    给你个例子
    declare @mydate date,@int int 
    select @mydate=min(orderdate) from tablename 
    --tmp_table 是自己建立的控制表。只有一行一列,初始是1。
    select @int =int from tmp_table 
    while  @mydate <'2010-01-01' and @int =1
    begin 
    delete tablename  where orderdate=@mydate 
    set @mydate=dateadd(day,1,@mydate)
    end 
    如果需要停止删除。就把临时表里面的值改成不是1就好了。
      

  6.   

    根据主键做循环删除----把需要删除的数据主键插入临时表
    SELECT ID INTO ##DEL_TMP_tb FROM TB 
    WHERE ...CREATE CLUSTERED INDEX IDX_ID ON ##DEL_TMP_tb(ID)
    CREATE TABLE #TMP_BATCH(ID BIGINT)WHILE EXISTS (SELECT TOP 1 1 FROM ##DEL_TMP_tb)
    BEGIN 
    DELETE FROM  #TMP_BATCH
    --每个batch 1000条
    INSERT INTO #TMP_BATCH
    SELECT TOP 1000 ID FROM ##DEL_TMP_tb
    --删除数据
            DELETE FROM  TB WHERE ID IN (SELECT ID FROM #TMP_BATCH)
    DELETE FROM ##DEL_TMP_tb WHERE ID IN (SELECT ID FROM #TMP_BATCH);
           --- waitfor delay '00:00.00.050'   
    ENDDROP TABLE ##DEL_TMP_tb
    DROP TABLE #TMP_BATCH
      

  7.   

    现在就是用job在删除,效率有点低,有张表找min(time)都好久的,都在线上,又不好乱动
      

  8.   

    现在做的job 每次删除一定条数,但是效率比较低,遇到资源占用的情况,执行时间被成倍拉长
      

  9.   

    如果可以的话,把2014年的数据插入新表,然后truncate之后再导回去。如果不行的话,控制每次删除的量,循环delete
      

  10.   

    干嘛要删除呢为了节省磁盘空间,还是想让查询更快一点?如果是为了磁盘空间的话,劝楼主不要做了,因为单纯的 delete 语句不但不会释放磁盘空间,它还会把删除操作写到日志里去,反而会占用更大的空间为了查询的话,俺木有什么建议
      

  11.   

    循环批量删试试declare @count bigint,@sum_count bigint
    select @sum_count=count(1) from tb
    set @count=0
    while @count<@sum_count
    begin
         delete top(@count) from tb where 限制条件
         set @count=@count+10000
    end
      

  12.   

    trun不太现实,每次删除的量小的话好删很久,量大的话有时候job执行时间被拉得太久,不知道怎么搞了
      

  13.   

    trun不太现实,每次删除的量小的话好删很久,量大的话有时候job执行时间被拉得太久,不知道怎么搞了你的这个表和其他表有很严密的关联不?
      

  14.   

    trun不太现实,每次删除的量小的话好删很久,量大的话有时候job执行时间被拉得太久,不知道怎么搞了你的这个表和其他表有很严密的关联不?
    关联不大
      

  15.   

    trun不太现实,每次删除的量小的话好删很久,量大的话有时候job执行时间被拉得太久,不知道怎么搞了你的这个表和其他表有很严密的关联不?
    关联不大那你先用truncate的方法移除2014年之前的数据,以后每年delete的方式删除前一年的数据,量不会大
      

  16.   

    trun不太现实,每次删除的量小的话好删很久,量大的话有时候job执行时间被拉得太久,不知道怎么搞了你的这个表和其他表有很严密的关联不?
    关联不大那你先用truncate的方法移除2014年之前的数据,以后每年delete的方式删除前一年的数据,量不会大
    truncate不是对整个表操作的么?能只移除2014之前的数据?
      

  17.   

    哥,先把需要保留的数据移到一个新表,实体表或临时表均可,然后把原表truncate,再把那个新表的数据插回去
      

  18.   

    几百万的数据如果没人用的前提下,插入临时表可能只需要4分钟左右,truncate接近实时,插回去可能只需要几分钟,整个过程可能不到15分钟,所有时间都是经验而已,没有理论支撑,仅供参考,如果这个时间是可接受的,那做好备份之后在系统闲时就可以做,这个方法会导致系统无法使用这个表,直到操作完毕,这个需要提醒你,如果不能接受,那就循del,几千万数据如果不停地小批量删除其实不会很慢的。
      

  19.   

    我觉得楼主可以先建一个新表t_new,把需要保留的数据插入到新表中,然后把旧表改名t_old,把新表t_new改为t
      

  20.   

    靠 DELETE 删数据总运行时间是减少不了的,循环分批删主要的目的是减少对其他会话的影响。
    而且即使强制终止循环任务,最多只回滚一批,前面的批次都已经成功删除了,不至于中断后又得从头做起。
      

  21.   

    几百万的数据如果没人用的前提下,插入临时表可能只需要4分钟左右,truncate接近实时,插回去可能只需要几分钟,整个过程可能不到15分钟,所有时间都是经验而已,没有理论支撑,仅供参考,如果这个时间是可接受的,那做好备份之后在系统闲时就可以做,这个方法会导致系统无法使用这个表,直到操作完毕,这个需要提醒你,如果不能接受,那就循del,几千万数据如果不停地小批量删除其实不会很慢的。说的好。
    其实 你要告诉领导的是 这个删除需要多久多久 ,然后发个通告到时候停机1个小时,做完就好了。
      

  22.   

    如45楼所说,不动原表,直接删除的效率比较低,忍无可忍了,要求停机维护,trun 半小时搞定