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.
大量删除的因素和工具
删除方法的选择取决于很多因素:
目标table是否分区?分区大大提高了删除性能。例如,通常有一个基于时间的大型 table 分区,从这些 table 中删除旧行可以像删除所需分区一样简单。请参阅有关管理分区 tables 的这些说明。
能不能把删除后的table重组一下,去掉碎片?
table 的删除百分比是多少?如果您要删除非常大的 table 中超过 30-50% 的行,则使用 CTAS 从 table 中删除比执行普通删除和重组更快table 块并重建约束和索引。
是否要释放已删除行消耗的 space?如果您知道空 space 将被后续 DML 重新使用,那么您将希望在 table 中保留空 space。相反,如果您想将 space 释放回 tablespace,则需要重新组织 table.
您可以使用许多工具从大型 table 中删除:
dbms_metadata.get_ddl:此过程将删除所有 table 索引和约束的定义。
dbms_redefinition:此过程将重组 table,同时它仍可用于更新。
Create Table as Select:您可以使用 CTAS 复制 table,同时批量删除行。
重命名table:如果在删除行时复制table,您可以将其重命名回原来的名称。
COMMIT:在删除可能 运行 数小时的情况下,即使是最大的 UNDO 日志也无法保存回滚信息,因此有必要在PL/SQL 循环,每隔无数行发出 COMMIT 以释放撤消日志。这种方法将自动重新启动table,因为删除将从上次提交检查点停止的地方开始。
更多信息请访问here
您可能需要考虑另一种方法:
- 在现有的基础上创建一个table
- 将空table中的标识列调整为从旧table的最新值开始(如果有的话)
- 使用
sp_rename
交换两个 table
- 从旧的table
批量复制记录到新的table
- 你可以用旧的table做任何你想做的事。
在开始删除记录/玩 tables 之前备份您的数据库。
我有一个包含 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.
大量删除的因素和工具
删除方法的选择取决于很多因素:
目标table是否分区?分区大大提高了删除性能。例如,通常有一个基于时间的大型 table 分区,从这些 table 中删除旧行可以像删除所需分区一样简单。请参阅有关管理分区 tables 的这些说明。
能不能把删除后的table重组一下,去掉碎片?
table 的删除百分比是多少?如果您要删除非常大的 table 中超过 30-50% 的行,则使用 CTAS 从 table 中删除比执行普通删除和重组更快table 块并重建约束和索引。
是否要释放已删除行消耗的 space?如果您知道空 space 将被后续 DML 重新使用,那么您将希望在 table 中保留空 space。相反,如果您想将 space 释放回 tablespace,则需要重新组织 table.
您可以使用许多工具从大型 table 中删除:
dbms_metadata.get_ddl:此过程将删除所有 table 索引和约束的定义。
dbms_redefinition:此过程将重组 table,同时它仍可用于更新。
Create Table as Select:您可以使用 CTAS 复制 table,同时批量删除行。
重命名table:如果在删除行时复制table,您可以将其重命名回原来的名称。
COMMIT:在删除可能 运行 数小时的情况下,即使是最大的 UNDO 日志也无法保存回滚信息,因此有必要在PL/SQL 循环,每隔无数行发出 COMMIT 以释放撤消日志。这种方法将自动重新启动table,因为删除将从上次提交检查点停止的地方开始。
更多信息请访问here
您可能需要考虑另一种方法:
- 在现有的基础上创建一个table
- 将空table中的标识列调整为从旧table的最新值开始(如果有的话)
- 使用
sp_rename
交换两个 table
- 从旧的table 批量复制记录到新的table
- 你可以用旧的table做任何你想做的事。
在开始删除记录/玩 tables 之前备份您的数据库。