SQL - 从第一行开始删除具有3.72亿行的表

时间:2016-05-11 08:44:38

标签: sql sql-server large-data

我有一个包含3.72亿行的表,我想从第一行开始删除旧行而不阻塞数据库。我该怎么做到?

表格

id | memberid | type |      timeStamp          | message |
1     123        10    2014-03-26 13:17:02.000    text

更新:

我在DB中删除了大约30 GB的空间,但我的DISC仍然是6 GB的空间.. 有什么建议可以获得这个空闲空间吗?

提前谢谢!

4 个答案:

答案 0 :(得分:9)

select 1;
while(@@ROWCOUNT > 0)
begin
   WAITFOR DELAY '00:00:10';
   delete top(10) from tab  where <your-condition>;

end

使用上面的sql

删除块

答案 1 :(得分:4)

您可能需要考虑另一种方法:

  1. 根据现有表格
  2. 创建表格
  3. 调整空表中的标识列,从旧表中的最新值开始(如果有)
  4. 使用sp_rename
  5. 交换两个表格
  6. 将记录分批复制到旧表中的新表
  7. 你可以用旧桌子做任何你想做的事。
  8. 在开始删除记录/播放表格之前备份数据库。

答案 2 :(得分:0)

最佳性能是按ID查询数据,然后:

delete from TABLENAME where id>XXXXX

是您可以执行的最低影响。

您还可以在子操作中划分操作,限制每个操作的已删除行数,并添加ROWCONT declatarion,

例如,如果您希望每次调用只删除5.000.000行,则可以执行此操作:

SET ROWCOUNT=5000000;
delete from TABLENAME where id>XXXXX;

在这里,您可以找到参考https://msdn.microsoft.com/it-it/library/ms188774%28v=sql.120%29.aspx?f=255&MSPPError=-2147217396

答案 3 :(得分:0)

  

从Oracle表中删除行的最佳方法的答案是:它   要看!在一个完美的世界里,你可以让桌子离线   维护,完全重组总是最好的,因为它确实如此   删除并将表放回原始状态。我们会   解决了进行大规模删除的工具和相应的工具   每种环境的方法。

大规模删除的因素和工具

删除方法的选择取决于许多因素:

  1. 目标表是否已分区?分区极大地提高了删除性能。例如,通常有一个大的基于时间的表分区,并且从这些表中删除旧行可以像删除所需的分区一样简单。请参阅有关管理分区表的这些说明。

  2. 您可以在删除后重新组织表以删除碎片吗?

  3. 该表的百分比将被删除?如果您要删除超大型表中超过30-50%的行,则使用CTAS从表中删除比执行vanilla删除和重组表块以及重构约束更快和索引。

  4. 您是否要释放已删除行所占用的空间?如果您知道后续DML将重新使用空白区域,那么您将希望在表格中留下空白区域。相反,如果要将空间释放回表空间,则需要重新组织表。

  5. 您可以使用许多工具从大型表中删除:

    1. dbms_metadata.get_ddl:此过程将打破所有表索引和约束的定义。

    2. dbms_redefinition:此过程将重新组织表,同时它仍可用于更新。

    3. 将表创建为选择:您可以使用CTAS复制表,同时批量删除行。

    4. 重命名表:如果在删除行时复制表,则可以将其重命名为原始名称。

    5. COMMIT:如果删除可能会运行很长时间,即使是最大的UNDO日志也无法保存回滚信息,因此有必要在PL / SQL循环中执行删除操作, COMMIT每个zillion-rows释放撤消日志。这种方法可以自动重新启动,因为删除将在最后一次提交检查点时从中断处继续。

    6. 更多信息请访问here