SQL - 从第一行开始删除 table 3.72 亿行

SQL - Delete table with 372 million rows starting from first row

我有一个包含 3.72 亿行的 table,我想从第一行开始删除旧行而不阻塞数据库。我怎样才能做到这一点?

table有

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

更新:

我在数据库中删除了大约 30 GB 的 Space,但我的 DISC 仍然是 6gb space.. 有什么免费的建议吗space?

提前致谢!

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

end

使用上述 sql

分块删除

最好的性能是通过id查询数据,那么:

delete from TABLENAME where id>XXXXX

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

您还可以将操作划分为子操作,限制每个操作删除的行数,添加 ROWCONT 声明,

例如,如果您希望每次调用只删除 5.000.000 行,您可以这样做:

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

在这里你可以找到一个参考[​​=12=]

The answer to the best way to delete rows from an Oracle table is: It depends! In a perfect world where you can take the table offline for maintenance, a complete reorganization is always best because it does the delete and places the table back into a pristine state. We will address the tools for doing large scale deletes and the appropriate methods for each environment.

大量删除的因素和工具

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

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

  2. 能不能把删除后的table重组一下,去掉碎片?

  3. table 的删除百分比是多少?如果您要删除非常大的 table 中超过 30-50% 的行,则使用 CTAS 从 table 中删除比执行普通删除和重组更快table 块并重建约束和索引。

  4. 是否要释放已删除行消耗的 space?如果您知道空 space 将被后续 DML 重新使用,那么您将希望在 table 中保留空 space。相反,如果您想将 space 释放回 tablespace,则需要重新组织 table.

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

  1. dbms_metadata.get_ddl:此过程将删除所有 table 索引和约束的定义。

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

  3. Create Table as Select:您可以使用 CTAS 复制 table,同时批量删除行。

  4. 重命名table:如果在删除行时复制table,您可以将其重命名回原来的名称。

  5. COMMIT:在删除可能 运行 数小时的情况下,即使是最大的 UNDO 日志也无法保存回滚信息,因此有必要在PL/SQL 循环,每隔无数行发出 COMMIT 以释放撤消日志。这种方法将自动重新启动table,因为删除将从上次提交检查点停止的地方开始。

更多信息请访问here

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

  1. 在现有的基础上创建一个table
  2. 将空table中的标识列调整为从旧table的最新值开始(如果有的话)
  3. 使用 sp_rename
  4. 交换两个 table
  5. 从旧的table
  6. 批量复制记录到新的table
  7. 你可以用旧的table做任何你想做的事。

在开始删除记录/玩 tables 之前备份您的数据库。