现在遇到这样一个问题:一个sql数据库,我要对其中一个数据表进行删除一些数据,这个数据表中一共有160万条记录,是从05年就开始的数据,我要把08年09年的留着,其他的都删掉。
如果手动一点点删,特别慢。
如果用delete from 表 where year(字段,4)=‘2005’,这样来删除05年的数据,它过一会之后,就弹出“超时已过期”,怎么办,每次弄都是这样。我已经把数据库的选项中的查询超时时间设置成了500.但还是出这个错误,一直无法解决!

解决方案 »

  1.   

    delete from 表 where year(字段,4)=‘2005’
    delete from 表 where DATENAME(YY,字段)=‘2005’
      

  2.   

    delete from 表 where 字段<'2008-01-01'
      

  3.   

    DELETE 表 WHERE 字段 < '2008-01-01'
      

  4.   

    分批删除,一次删除5000条记录:
    set rowcount 5000
    select top 1 * from 表 where year(字段,4)<2008
    while @@rowcount>0
    begin
      delete from 表 where year(字段,4)<2008
    end
    set rowcount 0
      

  5.   

    楼主因为做了处理所以才会慢。语句就这么写应该会快些。 delete from 表 where 字段 >'2005-01-02' and 字段 < '2006-01-01'
      

  6.   

    问题不太懂,怎么觉得你的函数用的都不对!select year(getdate())
    --返回为int
    /*
    2009
    */
      

  7.   

    --这样吧
    delete from 表 where 字段 <'2008-01-01'
      

  8.   


    delete from 表 where DATENAME(YY,字段)=‘2005’
    如果出现超时的情况,在设置中把超时的时间设置的长一些,可以试试
      

  9.   

    DELETE FROM 表 WHERE 字段 < '2008-01-01'
      

  10.   

    delete from 表 where 字段 <'2008-01-01',用这个的话,也是特别慢,然后也显示超时已过期,
    这个数据库还不能停,因为那边在一直用着。想问问大家,你们工作的地方有没有过这种问题,都是怎么解决的?
      

  11.   

    MSSQL没有oracle那样的nologing 所以只能寻求索引了
      

  12.   

    delete from tb where id < (select top 1 id from tb where 日期 < '2008-1-1' order by id desc)
      

  13.   

    建一个按时间分区的分区表,然后用switch table将数据转移到分区表中,再将2008年的数据从分区表中移到原来的表中就可以了,这样只是在内部移动数据,应该会很快
      

  14.   

    写一个循环的bat
    里面循环调用一个sql命令行执行,每次删除几千行为什么不在sql里循环?
    因为在sql里循环删除,日志大小还是取决于最终的所删的所有记录数的,还是会日志暴涨,时间超时
      

  15.   

    delete from 表 where 字段 <'2008-01-01'