我想把数据库中的一个表的数据删除一些(因为数据比较多了点),表中数据大概有有十几亿行,所以我写了一个语句准备把要删除的数据按条件删除
语句为:deleted from T_History where LDate = '2010-06-01'
这条语句我执行后,历时6个小时没有得到结果
请问高手们,如何快速的有条件的删除这些数据?

解决方案 »

  1.   

    十几亿。。
    LDATE是不是索引的键,把相关索引删了试试
      

  2.   


    大数据量删除要考虑一下问题:
    1、日志容量问题,因为删除大量数据会产生大量日志。
    2、锁提升问题十几亿的数据,最好用top N的方式批量删除。否则表会一直锁定,一旦出现服务器问题,启动会比较棘手。
      

  3.   

    呵呵,我也不清楚有没有所引,只知道LDate是插入数据库的时间
      

  4.   


    如果保留下来的数据是少数,可以先存出来。
    然后直接truncate table XXX 来的快些。
      

  5.   

    SET ROWCOUNT 5000
    WHILE 1=1
    BEGIN
       DELETE from T_History where LDate = '2010-06-01'
    IF @@ROWCOUNT<5000
    BREAK;
    END
    --LDate 上有索引没有,索引也能加快速度,不过也要维护索引
      

  6.   

    最好是While循环删除
    --这样就会避免锁定TB
    DECLARE @max_Count int
    SELECT @max_Count=10000
    WHILE @max_Count=10000
    begin
       deleted top 10000  from T_History where LDate = '2010-06-01'
       select @max_Count=@@rowcount
       -- waitfor delay '00:00:03'
    end
     
      

  7.   

    SET ROWCOUNT 5000
    WHILE 1=1
    BEGIN
      DELETE from T_History where LDate = '2010-06-01'
    IF @@ROWCOUNT<5000
    BREAK;
    END
    SET ROWCOUNT 0
      

  8.   

    按你的语句只是想删除一点数据,但这样会改变索引结构,所以会造成索引的重建。
    一般操作是删除索引,然后DELETE数据,再重建索引.数据太大,这样的操作也会很费时间的。
    其实,不一定要去DELETE掉,可以在前台控制就可以~~你前台控制忽略那部分数据这样比较好。
    大表尽量少DML DDL操作吧。
      

  9.   

    MDL DDL是什么,我新接触数据库
      

  10.   

    后来我规定了几个时间段,只杀出一条数据
    比如是 Delete from T_History where LDate = '2010-06-01 12:32:42'
    但是结果和范围大点的时间段一样
    很慢
      

  11.   


    DML data manipulation language 数据库操作语言,就是增删改查这些;
    DDL data definitition language 数据库定义语言,create、alter的。。google下就有了。
      

  12.   

    这里高手多点就懒的下手Google了,不好意思了呵呵!
      

  13.   

    肯定是分批删除或者保留的数据不多,就在闲余时将保留的数据Into _Bak,删除原表,改_Bak名,加上索引、约束、TRIGGER等
      

  14.   

    肯定是慢的,因为要把这些需要删除的记录都写到日志中。就像之前别人说的,如果需要删除的记录占了表的大部分,还不如把要保留的记录拷出来,将表Truncate掉再重新填充。最好的办法还用分区的方法,不过就比较复杂一点点。
      

  15.   

    1 请DUMP 你的日志。
    2 请进行数据库网格化分割或请建立NDF文件放到其他逻辑分区,增加I/O性能
    解释 1 DML 会有日志,而且不少所以请先DUMP你的日志
        
         2 增加NDF 的原因是继续插入的数据引入到其他逻辑盘,减小你在删除数据库时对删除数据逻辑盘的
     
           I/O压力。